|
|
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
А что такое TStringList? Это массив строк? Он непрерывно хранится в памяти? Что происходит, если добавляешь элемент, например, в середину? А если несколько StringList'ов, и попеременно добавлять и туда, и сюда, то они фрагментируются? Или полностью копируется весь StringList на новое место? А вообще, мне нужно отсортировать несколько (сотен) миллионов строк, удалив одинаковые. Пока StringList с Sorted=true работает, но, возможно, медленно. Можно ли сделать что-то принципиально быстрее? Использую несколько StringList'ов, чтобы разные записи, например, начинающиеся на разные буквы, сохранять в разных StringList'ах. Так, наверно, быстрее (сортировать несколько маленьких, чем один большой). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 02:17 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
registeredА что такое TStringList? Это массив строк? Он непрерывно хранится в памяти? Что происходит, если добавляешь элемент, например, в середину? А если несколько StringList'ов, и попеременно добавлять и туда, и сюда, то они фрагментируются? Или полностью копируется весь StringList на новое место? А вообще, мне нужно отсортировать несколько (сотен) миллионов строк, удалив одинаковые. Пока StringList с Sorted=true работает, но, возможно, медленно. Можно ли сделать что-то принципиально быстрее? Использую несколько StringList'ов, чтобы разные записи, например, начинающиеся на разные буквы, сохранять в разных StringList'ах. Так, наверно, быстрее (сортировать несколько маленьких, чем один большой). В Вашем случае прямо таки напрашивается использование какой нибудь СУБД. Возможно встроенной, например SQLite или Firebird embedded. Загоняете массив строк в табличку, а далее уже SQL выражениями делаете любую выборку. Все современные СУБД делают это очень быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 06:54 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
black-manatee, СУБД? Ради сортировки строк? Реально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 10:12 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
registered, Быстрей можно всегда, только это ручками делать надо. Например побить свой лист на много более мелких. Так сортировка будет работать значительно быстрей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 10:34 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
registeredА что такое TStringList? Это массив строк? Он непрерывно хранится в памяти? Что происходит, если добавляешь элемент, например, в середину? А если несколько StringList'ов, и попеременно добавлять и туда, и сюда, то они фрагментируются? Или полностью копируется весь StringList на новое место? А вообще, мне нужно отсортировать несколько (сотен) миллионов строк, удалив одинаковые. Пока StringList с Sorted=true работает, но, возможно, медленно. Можно ли сделать что-то принципиально быстрее? Использую несколько StringList'ов, чтобы разные записи, например, начинающиеся на разные буквы, сохранять в разных StringList'ах. Так, наверно, быстрее (сортировать несколько маленьких, чем один большой).1. фиговые дела происходят, блочное копирование 2. незначительно метод сортировки в узких случаях нужно подбирать индивидуально, реализация сортировки в TSringList от дельфи, редкий позор + сортировка Хаора очень чувствительна к функции сравнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 11:10 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. + можно через TTask распараллелить по кускам и потом склеить, будет быстрее в зависимости от кол-ва ядер и процессоров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 11:30 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Я тут на коленке накидал распараллеливание, получил на 10 млн строк на 1 процессоре и 4 ядрах в 1 поток заняло 10 секунд разбиение на 4 равные части сортировка каждой части на отдельном ядре слияние 4 частей в 1 массив заняло 5 секунд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 11:54 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
X-Cite, вся беда таких тестов что они не учитывают реальные данные и особенности алгоритмов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 12:03 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
X-CiteЯ тут на коленке накидал распараллеливание, получил на 10 млн строк на 1 процессоре и 4 ядрах в 1 поток заняло 10 секунд разбиение на 4 равные части сортировка каждой части на отдельном ядре слияние 4 частей в 1 массив заняло 5 секунд ты бы на нормальных строках делал, длиной хотя бы 50 знаков и из букв... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 12:05 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгенийblack-manatee, СУБД? Ради сортировки строк? Реально? Сортировка с выкидыванием дублей. TStringList так вроде не умеет. А в чем собственно проблема ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 12:34 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
А можно еще хешик сделать. На первые несколько букв строки. И сортировать по хэшу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 12:42 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
black-manatee, То есть вы не видите проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 12:43 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
black-manateeСортировка с выкидыванием дублей. TStringList так вроде не умеет. Да ну правда что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 12:52 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Tactical Nuclear Penguinты бы на нормальных строках делал, длиной хотя бы 50 знаков и из букв... Это не важно.. Цель была оценить распараллеливание по виртуальным процессорам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 12:54 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгенийblack-manatee, То есть вы не видите проблемы? Озвучите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 13:43 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
black-manatee, оставим, что ради сортировки нужно в приложение притащить БД пойдем дальше ТС пишет что исходный вариант (сортировка в памяти) работает, но медленно для примера возьмем результат X-Cite, у него сортировка заняла 10 сек для начала сравните, плз, сколько у вас займет "загнять массив строк в таличку" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 13:59 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгенийblack-manatee, оставим, что ради сортировки нужно в приложение притащить БД пойдем дальше ТС пишет что исходный вариант (сортировка в памяти) работает, но медленно для примера возьмем результат X-Cite, у него сортировка заняла 10 сек для начала сравните, плз, сколько у вас займет "загнять массив строк в таличку" Думаю быстрее, чем сортировка (если загнать к примеру файл в блоб и скриптом или процедурой уже запихнуть в табличку). Ну и сортировка будет точно быстрее. Но вообще речь не об этом. Человек работает с сотнями миллионов строк. Эти строки у него откуда то берутся (какие нибудь логи или что-то еще), записываются в какое-то хранилище (текстовые файлы), потом неким образом обрабатываются (сортируются и удаляются дубли), потом опять куда-то записываются (в те же или другие текстовые файлы), а затем очевидно где-то далее используются. То есть по сути речь идет о простой, но достаточно объемной БД, в качестве каковой registered использует текстовые файлы. По моему очевидно, что использование СУБД в данном случае для всей этой байды реально напрашивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 15:17 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
black-manateeПо моему очевидно, что использование СУБД в данном случае для всей этой байды реально напрашивается. А мне очевидно что напрашивается ElasticSearch + Kibana ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 16:01 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Кстати, TArray.Sort сортирует в другом порядке, нежели StringList. Пока что получилось, TArray где-то в 2 раза быстрее. 3327471 записей (98.1 мб) 25,125 сек - сорт StringList после загрузки 13,953 сек - сорт TArray<ansistring> TArray - это то же самое, что и array of string? Мне этот синтаксис непривычен. Чем он хорош? Тем, что там есть Sort? А что мешало сделать отдельную функцию Sort для массива? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 16:12 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
http://docwiki.embarcadero.com/Libraries/Rio/en/System.Generics.Collections.TArray Это просто удобная обертка для статических дженериковских функций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 16:26 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Ну и сам тип конечно... http://docwiki.embarcadero.com/Libraries/Rio/en/System.TArray ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 16:28 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
StringList сортирует так, что одинаковые записи, различающиеся строчными и прописными буквами, будут соседними, а TArray - по коду символа, т.е., они будут в разных местах. Можно ли сделать, чтобы по-другому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 19:15 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
registered, AnsiUpperCase. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 19:28 |
|
||
|
Сортировка сотен миллионов строк с удалением дублей
|
|||
|---|---|---|---|
|
#18+
Там (в StringList) даже не посимвольно сравнивает, а, к примеру, test031 и test-03-1 будут вперемешку. function TStringList.CompareStrings(const S1, S2: string): Integer; begin if CaseSensitive then Result := AnsiCompareStr(S1, S2) else Result := AnsiCompareText(S1, S2); end; Добавил свой компаратор, такой: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Теперь сортирует так же, как StringList, но в 3 раза медленнее. StringList - 9,641 сек TArray.Sort (comparer) - 25,859 сек TArray.Sort (по умолчанию) - 4,234 сек Выборка та же, что и в прошлый раз, только тогда был комп загружен. И зачем я всё это делал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2019, 20:59 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39833426&tid=2039285]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
146ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
3ms |
| others: | 204ms |
| total: | 449ms |

| 0 / 0 |
