Страницы: Пред. 1 2 3 4
RSS
Удаление дубликатов Collection vs. Dictionary
 
AAF, действительно, скорость выросла. Файл с 600 000 строк обработал за 15.5 сек.
Заметил такой баг - если подать на вход файл, в котором только уникальные значения, макрос выдает ошибку.
 
bedvit,
опробовал exe-версию на файле 2.7 Гб с 48 миллионами строк - время работы всего 1 мин 22 сек.
файл 8 Гб с 55 миллионами строк программа обработала за 2 мин 22 сек.
 
Цитата
AB1 написал:
на вход файл, в котором только уникальные значения, макрос выдает ошибку
Что-то мне не везет... Никак ее не получить :(
Ведь у меня все тесты проходили именно на таких файлах, т. к. они обуславливают максимальное время обработки.
AB1, А можно скрин ошибки в коде одним глазком глянуть? Похоже там дело в файле....
Изменено: AAF - 03.12.2017 06:26:57
 
Цитата
AB1 написал:
2.7 Гб с 48 миллионами строк
Цитата
AB1 написал:
8 Гб с 55 миллионами строк
7млн.строк сожрали 5.3 гига? Всегда думал, что здесь линейная зависимость) Если посмотреть лог в консоле, то можно увидеть, что половину времени занимает открыть и записать файл в вектор, а вторую половину собственно, сама обработка и запись в новый файл.
«Бритва Оккама» или «Принцип Калашникова»?
 
AAF, ошибки получал из-за того, что параллельно была запущена программа, которая использовала папки "IN" & "OUT", а также из-за конфликта имен в папках "IN" & "IN\Arch".
Опишу случай, которому пока нет объяснения :)
В папку "IN" помещаю 8 файлов объемом около 500 Мб, в каждом из которых есть уникальные строки.
Запускаю макрос.
После некоторого времени программа прекращает работу без сообщения об ошибке и записи информации на листе.
В папке "OUT" появляется 5 файлов, в папке "IN" остается 2, остальные 6 перемещены в "IN\Arch".
 
Цитата
bedvit написал:
7млн.строк сожрали 5.3 гига?
Нет, эти файлы содержат разную информацию :)  
 
AB1, Это мой косяк... :(
Я забыл скопировать в файл измененную процедуру для нескольких файлов, в то время как до этого тестил с одиночными.
Вот она, нужно заменить...
Скрытый текст

Скрытый текст
Изменено: AAF - 03.12.2017 14:05:42
 
Сколько времени занимает
Код
aSortUniq = Split(oOUT.ReadAll, vbCrLf)

Мне думается что на достаточно объёмном файле это может быть излишне долго, и может нехватить памяти, с учётом того что далее это всё нужно переложить в словарь/коллекцию и плюс ещё в другой массив. Да и собственно oOUT.ReadAll тоже висит там же какое-то время.
Поэтому я и предлагал всё делать построчно - тогда в момент в памяти будет только обрабатываемая строка и словарь/коллекция.
 
Цитата
Hugo написал:
может нехватить памяти, с учётом того что далее это всё нужно переложить в словарь/коллекцию
Конечно может. :)
aSortUniq не ограничена в отличии от Collection и Dictionary по количеству записей и которые не используются в данном решении вообще.
Она быстрее Dictionary, но проигрывает Collection в два раза по скорости.
Во время обработки aSortUniq в памяти висит три массива Split(oOUT.ReadAll, vbCrLf) и два подобных, но с индексами первого.
Цитата
Hugo написал:
я и предлагал всё делать построчно
Я, кстати, в целом того же мнения, потомучто предполагаю, что такие вещи как уникализация вряд ли требуют первостепенной срочности, но скорей автоматизации.
Например скрипт положил куда-нибудь и он крутится себе и никому не мешает, только в топку подкидывай новые поступления... :)
Можно даже комбинировать построчность с фрагментальностью, но это уже вопрос конкретной ситуации, где, кстати, скрипт всегда легко адаптировать.
Изменено: AAF - 03.12.2017 14:28:11
 
AAF, попробовал исправленную версию.
Из тех же 8 файлов, на выходе получил 5:
Код
03.12.17 14:42:44 2000052 20171203_144244_2.csv 2 32,535 26,594 1,055 60,184
03.12.17 14:42:35 1500035 20171203_144235_2.csv 2 25,652 24,938 1,055 51,645
03.12.17 14:42:26 1000022 20171203_144226_4.csv 4 18,871 23,051 1,055 42,977
03.12.17 14:42:17 500011 20171203_144217_4.csv 4 12,102 21,074 1,055 34,230
03.12.17 14:41:57 500007 20171203_144157_500007.csv 500 007 4,480 10,453 1,055 15,988
Их суммарный объем равен 500 019, но если проверить реальное количество строк, то получится 500 015, т.е. 4 раза были посчитаны пустые строки.
Но, часть информации потерялась, т.к. на выходе должно быть 500 033 строки.
 
Цитата
AB1 написал:
Но, часть информации потерялась
Забыл сбрасывать флаг.
Перезалил файлик в сообщении 89
Цитата
на выходе должно быть 500 033 строки
Я другими средствами проверил = 500 031. Но у меня пустые строки не отменены, поэтому 500 032, т.к. пустая строка - одна уникальная, а он считает только уникальные.
Цитата
В папке "OUT" появляется 5 файлов, в папке "IN" остается 2, остальные 6 перемещены в "IN\Arch".
После обрабатывания макроса не должно оставаться файлов, потому что, даже если он не нашел новых записей, то складывает входящий файл в папку Arch.
Отсюда следует, что отваливается без объяснения причин. Но странно, в сравнении одновременно участвуют только два файла и всего каких-то 500 000 строк.
Я проверял на MSO2013x32 и MSO2016x64 ОЗУ=4Gb - все выполняется без проблем.
И еще сделал добавку к имени входящего файла в начало приписку идентичную имени файла - его уникальной выжимке в папке OUT.
Спасибо за участие
Изменено: AAF - 03.12.2017 19:04:43
 
Цитата
AAF написал:
Вообщем по сравнению с решением от  bedvit , это просто игрушки.  Даже не знаю, стоит ли заморачиваться...
Стоит, не всегда под рукой будет Сишный компилятор. И алгоритмы компилятор сам не придумывает.
По своему exe - из 40 секунд - 30 секунд уходит на чтение запись потока из/в файл. И только 10 на сам алгоритм (см. рис)
Распараллеливание ничего не даст, если это не RAID HDD (да и то под вопросом прирост). Даст прирост SSD, но это уже hardware, а не software.
Изменил метод чтения-записи на бинарный, экономия на этих операциях - 17%, в общем - 12%
Где то читал, что этот метод не всегда подходит к строкам, но ошибок нет, можно протестировать.
Exe выкладываю + результаты тестов.
Изменено: bedvit - 03.12.2017 22:56:03
«Бритва Оккама» или «Принцип Калашникова»?
 
Коллеги, крутенько у вас тема развилась. Сильны!
 
Андрей, спасибо за оценку, это коллективный труд нескольких человек :)
Перевел на Юникод консоль, можно писать полный путь файлов с пробелами и в кириллице.
В командной строке, если имя с пробелом - в двойные кавычки-стандартный сценарий (в консоле кавычки не нужны).
.exe в тестовом файле прилагаю.

Update:
Добавил 4-й параметр в .exe (выводить ли лог в конце или закрывать). По умолчанию закрывать. В случаях если хотим посмотреть итоги и запускаем из командной строки (запуск двойным кликом .exe по умолчанию показывает итоги)
Вид Юникод-панели с кириллицей:

З.Ы. Думаю этот вариант вполне рабочий, далее оптимизации и изменения - по запросу.
Изменено: bedvit - 05.12.2017 16:48:42 (Подписал комментарии к .exe, оформил проект)
«Бритва Оккама» или «Принцип Калашникова»?
 
Огромное спасибо всем, кто причастен к этому шедевру!  8)

Может в копилку перенести?…
Изменено: Jack Famous - 05.12.2017 14:07:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Выложу код. Для нашего форума не жалко  ;)  может кто-то захочет использовать или оптимизировать (для работы в Unicode, нужно сохранить проект в Unicode, выставить в компиляторе "Использовать набор символов Юникода")

Скрытый текст
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: Пред. 1 2 3 4
Наверх