Страницы: Пред. 1 2 3 4 След.
RSS
Как отсортировать 5 миллионов строк?
 
Вариант #51 дает лишние слэши в конце из-за наличия последнего столбца в котором может быть дополнительный текст. Поправил это дело, но производительность упала до 86 сек. Ну, как вариант с применением выражений SQL и возможностью простой выгрузки результата в DBF, Excel и различные форматы текста вполне может сгодиться. файл schema.ini
Код
[file.txt]
ColNameHeader=False
Format=Delimited(/)
CharacterSet=1251
TextDelimiter="none"
Col1=clm1 Text
Col2=clm2 Text
Col3=clm3 Text
Col4=clm4 Text
Col5=clm5 Text
Col6=clm6 Text
Col7=clm7 Text
MaxScanRows=0

[result.txt]
ColNameHeader=False
Format=Delimited(/)
CharacterSet=1251
TextDelimiter="none"
Col1=clm1 Text
MaxScanRows=0
код VBA
Код
Sub TextFileSort()
    Dim ft As Single: ft = Timer
    Dim objRS: Set objRS = CreateObject("ADODB.Recordset")
    objRS.Open "SELECT [clm1]+'//'+[clm3]+'/'+[clm4]+'/'+[clm5]+'/'+[clm6]+IIF([clm7] IS NOT NULL, '/'+[clm7], '') AS [clm1] INTO [result.txt] FROM [file.txt] IN 'D:\temp' 'TEXT;' ORDER BY VAL([clm6])", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp;Extended Properties=TEXT"
    Debug.Print "Full time: " & Timer - ft
End Sub
Jack Famous, вряд-ли чем-то помогу, все упирается в производительность ADO. у меня ваш пример выполняется за 63 сек

PS еще раз поправил схему и запрос с учетом наличия лидирующих нолей, либо не числового значения...
PPS на всякий случай: синтаксис SQL в OLE DB из FoxPro, как-то мне эта инфа не сразу попалась...
Изменено: DenSyo - 29.06.2020 14:17:01
 
Андрей VG, а мой из #45 за сколько у тебя отрабатывает?  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Андрей VG написал:
а вот сортировка не очень
Андрей, а этот вариант? (изменил алгоритм сортировки на concurrency::parallel_buffered_sort)
Цитата
Андрей VG написал:
Full time: 27,70703
неплохо для VBA!
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Jack Famous написал:
а мой из #45 за сколько у тебя отрабатывает?
ADODB.Обработка:            31 сек
ADODB.Сортировка:           3 сек
ADODB.Запись:               20 сек
ADODB.Итого:                53 сек

Цитата
bedvit написал:
а этот вариант?
На картинке. Супер!
Изменено: Андрей VG - 29.06.2020 17:30:26
 
Цитата
Андрей VG: ADODB
я про СВОЙ вариант (массивный)  :D
Если не сможешь, то завтра постараюсь сам оттестировать свой и твой новый
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
я про СВОЙ вариант (массивный)
Семён Семёныч  :D
Array.Обработка:            6 сек
Array.Sort:                 6 сек
Array.Запись:               14 сек
Array.Итого:                26 сек
 
Цитата
Андрей VG написал:
Array.Итого:                26 сек
совсем неплохо!
Цитата
Андрей VG написал:
Full time: 27,70703
и у Андрея похожие результаты. Догоняете мой exe.
Уже напрягся)
MCH, спасибо.
Цитата
MCH написал:
Реализовано на Freebasic (легко перевести на VBA)
есть ли смысл? на Freebasic будет явно быстрее, может просто подключить библиотеку и протестировать?
Изменено: bedvit - 29.06.2020 18:58:37
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Андрей VG: Array.Итого: 26 сек
то есть ничья  :D
Хотя мой вариант мне (субъективно, естественно) кажется проще и очевиднее
А, учитывая "готовую" процедуру сортировки, и вообще — "в лоб")))

Цитата
bedvit: Догоняете мой exe
боюсь, что сколь значимый прирост в скорости маловероятен  :cry:
Была идея регулярками извлекать числа (сразу из всей строки в массив без цикла) - было бы точно быстрее, чем в цикле, НО один хрен нужно в цикле собирать строки, а Split тупит безбожно (когда строка состоит из сцепки 5 млн строк длиной ~50 символов каждая, навскидку)
Можно написать свой аналог Split'а для овердлинных строк и тут, даже на VBA он должен выиграть, не говоря уже о C++

Цитата
bedvit: на Freebasic будет явно быстрее
быстрее, чем на VBA, но медленнее, чем на C++ — верно?))
Изменено: Jack Famous - 29.06.2020 20:03:22
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Split тупит безбожно (когда строка состоит из сцепки 5 млн строк длиной ~50 символов каждая, навскидку)
и сколько это по времени составляет?
Цитата
Jack Famous написал:
быстрее, чем на VBA, но медленнее, чем на C++ — верно?))
зависит от алгоритма и оптимизации кода самим компилятором. Можно собрать и проверить.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: сколько это по времени составляет?
у меня дольше, чем всё время макроса по другому алгоритму
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
bedvit написал:
Можно собрать и проверить.
Сделал сортировку под текущую задачу
Ищет число после последнего "/", если там текст, то принимает значение за 0
Значения сортируются как числа: 100 > 20
Скачивает текстовый файл по блочно по 10 млн. строк, каждый блок сортируется быстрой сортировкой, затем объединяются путем слияния файлов (сортировкой слияния)
Реализовано на FB, версия 64bit работает чуть быстрее 32bit на этапе сортировки, дисковые операции очень медленные
Вместо тестового файла "File.txt" подставьте рабочий файл
Изменено: MCH - 30.06.2020 22:11:01 (Заново загрузил файл)
 
Цитата
MCH: если там текст, то принимает значение за 0
вот этот момент бы поправить и совсем хорошо будет
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
А что на счет скорости, как отрабатывает код, если не принимать во внимание текстовое значение?
 
На моем компьютере (Win10 -64, SSD) программа из #73 на исходных в этой теме данных (290 МБ):

Read: 4.35
Sort: 0.17
Write: 0.96

Full Time: 5.48
Изменено: sokol92 - 30.06.2020 16:52:49
Владимир
 
Цитата
MCH: что на счет скорости
у меня какой-то треш - то ли из-за работы в облачном диске, то ли от Win10 (на работе) - открывается txt (и руками и макросом) порядка МИНУТЫ
При такой ерунде у нас с Андреем по 136 секунд общего выполнения, а у вас 90 — то есть сильно быстрее  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, а сколько мой?
«Бритва Оккама» или «Принцип Калашникова»?
 
сделал тесты на домашнем стабильном компе

bedvit
Время: 6,5 сек
Проблемы: сортировка некорректная
Скрины

MCH
Время: 9,5 и 10,5 сек (для x64 и x32 - соответственно)
Проблемы: сортировка некорректная (даже не учитывая текст после последнего слэша)
Скрины

Андрей VG,
Время: 45 сек
Скрины

Jack Famous
Время: 46 сек
Скрины

Выводы: если взять чтение и обработку у меня (12 сек), а сортировку (7 сек) и запись (14,5 сек) у Андрея, то получим 33,5 сек - то есть ещё на 25% быстрее

P.S.: тише едешь — дальше будешь. Тестируйте свои решения  ;)
Изменено: Jack Famous - 01.07.2020 12:02:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Проблемы: сортировка некорректная (даже не учитывая текст после последнего слэша)
Это я косячнул, хотел немного ускорить быструю сортировку, добавил сортировку вставками на коротких участках, реализовал криво - исправляюсь
Вложение в сообщении #71 обновил
С текстом не понятно, как нужно сортировать - после чисел?
 
Цитата
Jack Famous написал:
создан файл без расширения,
какое расширение указывается, такое и создается. Видимо вы файл без расширения указали на выходе.
Цитата
Jack Famous написал:
Сортировка некорректная
где именно некорректная? Поясните на примере.
Изменено: bedvit - 30.06.2020 23:33:13
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Jack Famous написал:
Время: 45 сек
Алексей, всмотрелся в ваш код. Вы просто берёте число после последнего /, а я использовал регулярки. Если вернуть InStrRev, то будет такой результат (ну, чуть сортировку поменял).
Read time: 4,78125
Sort time: 4,609375
Write time: 7,578125
Full time: 16,96875
 
Цитата
MCH: С текстом не понятно, как нужно сортировать - после чисел?
сортируем только строки с числами и только по числам в этих строках
Цитата
bedvit: вы файл без расширения указали на выходе
точно - мой косяк, прошу прощения
Цитата
bedvit: где именно некорректная? Поясните на примере
а я старался, скрины делал, чтобы вопросов не возникало  :cry:
Сравните свой итог сортировки и наш с Андреем (либо просто посмотрите скрин вашего результата, который я прикрепил к вашим итогам в предыдущем сообщении)
Цитата
Андрей VG: Вы просто берёте число после последнего /, а я использовал регулярки
ну я ещё проверяю, чтобы после последнего слэша было число и, если нет, то беру между 2мя последними слэшами. У тебя как раз опять этой проверки нет  ;) Мы "на вы" опять?))
P.S.: регулярки бы дали жару, если бы построчное чтение не было бы быстрее в 2-3 раза, чем FSO.ReadAll — с такой овердлинной строкой можно было бы и Split самодельный слепить для частного случая  ;)

Ускорился в 2 раза до 23 сек (рано списали FSO со счетов)
Андрей VG, запусти у себя - у тебя должно быть секунд 15…
Изменено: Jack Famous - 01.07.2020 09:04:24
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
сортируем только строки с числами и только по числам в этих строках
Это откуда такое условие?
Посмотрел вашу сортировку, строки сортируются неправильно (отметил) в моей все ОК. Или у вас какая-то особенная не стандартная сортировка. У меня стандартная по строкам. Посимвольно.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Это откуда такое условие?
Цитата
georgmann: 6) Теперь я могу сортировать по возрастанию все строки, ориентируясь на шестую колонку, в которой содержаться числа
да с самого, что ни на есть, начала — ничего особенного  :D
Забавно, что другого трактования и близко в теме не было)))
Изменено: Jack Famous - 01.07.2020 12:00:58
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Да, невнимательно прочитал. У меня обычная сортировка.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, не думаю, что вычленение чисел сильно вас замедлит, к тому же у вас наверняка есть супербыстрые целочисленные сортировщики для нормального распределения - так что, может даже шустрее выйдет  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, скажу больше, есть интересная идея, которая надеюсь сильно ускорит сортировку txt. Нужно время реализовать.
«Бритва Оккама» или «Принцип Калашникова»?
 
Добрый день, коллеги! Андрей, в Вашем примере из #80 (и в остальных аналогичных) может ускорить выполнение параметр Len=32767 оператора Open для чтения и записи.
Владимир
 
sokol92, приветствую!
Выиграл стабильную секунду, а в итоге 3 (почему-то) - неплохо  :idea: спасибо  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Секунда на чтении, две на записи...  Сотня фертингов на дороге не валяется.
Владимир
 
Цитата
sokol92: две на записи
запись в новый файл и через FSO - разве есть связь? Отрыв небольшой - можно списать на колебания мощности, но лишним точно не будет. Полагаю, что можно использовать Len=32767 по-умолчанию, при открытии любых файлов. Правильно? Не будет сбоить на маленьких?
Изменено: Jack Famous - 01.07.2020 14:57:13
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: Пред. 1 2 3 4 След.
Наверх