Вверх ↑
Этот топик читают: Гость
Ответов: 1341
Рейтинг: 31
#1: 2018-02-25 09:20:44 ЛС | профиль | цитата
Есть порядка 300 файлов, а в них есть повторяющиеся строки, в 1 файле повторов нет, а вот в 10 файлах может быть по 2 и более повторов, размер файла от 10КБ до 5ГБ, суммарный вес файлов ~40 ГБ, как можно дубликаты удалить?
карма: 2

0
vip
#1.1контекстная реклама от партнеров
Ответов: 16884
Рейтинг: 1239
#2: 2018-02-25 12:44:20 ЛС | профиль | цитата
Всё время поражаюсь "умению" задавать вопросы.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 8885
Рейтинг: 823
#3: 2018-02-25 15:10:39 ЛС | профиль | цитата
Tad, а между строк
"в 1 файле повторов нет" --- внутри файла строки не повторяются.
"в 10 файлах может быть по 2 и более повторов" --- в разных файлах могут быть одинаковые строки, все их надо удалить, кроме одной.
Отсюда и алгоритм.
(А коллеге Rysik-у простительно, он и в 16 лет не совсем ясно выражал свои мысли, в 21 уже не исправишь )
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#4: 2018-02-25 16:27:58 ЛС | профиль | цитата
1.
Rysik писал(а):
Есть порядка 300 файлов
Каких? Строки не только в txt-файлах.
2.
Rysik писал(а):
в 1 файле повторов нет
Это в ОДНОМ или в ПЕРВОМ ?
3.
Rysik писал(а):
а вот в 10 файлах может быть по 2 и более повторов
A в остальных "порядка" 288-и что? В именах файлов видно - есть повторы или нет?
4. Повторы с учетом регистра или нет.
5. Повторы в каждом отдельном файле или сквозное удаление ?
И т.д. и т.п.
Пойди туда не знаю куда, принеси то не знаю что


Редактировалось 3 раз(а), последний 2018-02-25 16:42:54
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1924
Рейтинг: 172
#5: 2018-02-26 12:55:24 ЛС | профиль | цитата
Rysik писал(а):
Есть порядка 300 файлов, а в них есть повторяющиеся строки, в 1 файле повторов нет, а вот в 10 файлах может быть по 2 и более повторов, размер файла от 10КБ до 5ГБ, суммарный вес файлов ~40 ГБ, как можно дубликаты удалить?

Я так понимаю, вопрос только в быстродействии? Потому что с самим алгоритмом проблем быть не должно. Например, если это просто текстовые файлы, то поможет

Add(ArrayFilterRepeats,8147799,273,315)
{
}
Тем, более, что он теперь ускорен.

И да, повторы искать только внутри каждого файла или между файлами тоже?
карма: 9
0
Ответов: 1341
Рейтинг: 31
#6: 2018-02-26 13:23:08 ЛС | профиль | цитата
3042 писал(а):
И да, повторы искать только внутри каждого файла или между файлами тоже?


между файлами, какой бы ни был ArrayFilterRepeats, это неделю ждать?, железо с этими файлами справиться должно точно на ура (6 ядера по 4.3 и SSD M2.0), но вот методы увы не скоростные, пробовал 1 млн строк убирать дубликаты, это прям жёстко, минут этак за 10-20 выдало всего лишь 50000 строк (без подцепления копирования их в список)

по идее хотелось бы собрать эту шляпу на 40 гб в 1 кучу, удалить повторения, срезать строки длинной более скажем 63 символов, пустые строки удалить и далее рассовать данные в файлы объёмом по пол гига

--- Добавлено в 2018-02-26 13:28:52

Tad писал(а):
Каких? Строки не только в txt-файлах.

текст

Tad писал(а):
Это в ОДНОМ или в ПЕРВОМ ?


в сами файлы вроде отформатированы до нормы, тоесть в них повторений быть не должно, а вот между файлами любыми друг по отношению к другу могут быть повторения, 2-5-10 повторений между файлами

Tad писал(а):
Повторы с учетом регистра или нет.


кодировка, регистр, ну вобщем те строки у которых контрольные суммы равны

Редактировалось 1 раз(а), последний 2018-02-26 13:28:52
карма: 2

0
Ответов: 758
Рейтинг: 112
#7: 2018-02-27 14:22:00 ЛС | профиль | цитата
Rysik, Если выложиш пример маленьких файликов, и схему раздумий, то можно дальше ускорять.
А так, можно сделать перебор всех строк во всех файлах. + подключить БД. Расчитываеш хеш строки и проверяеш есть такой хеш в таблице БД или нет. Если нет - добавляеш и переносиш строку в новый файл, иначе пропуск
Удачи
карма: 1

0
Ответов: 1341
Рейтинг: 31
#8: 2018-02-27 19:52:18 ЛС | профиль | цитата
miver писал(а):
+ подключить БД


хорошая идея, но программа 2-х гиговый файл то не откроет, не говоря уже о переборе строк и связью с бд, это всё наоборот утежеляет процесс весь
карма: 2

0
Ответов: 758
Рейтинг: 112
#9: 2018-02-27 20:20:55 ЛС | профиль | цитата
Rysik, А так

Add(Button,13370250,259,84)
{
Left=25
Top=45
link(onClick,12930845:doOpen,[])
}
Add(Label,10171826,399,133)
{
Left=105
Top=50
link(Text,14692418:Count,[])
}
Add(InlineCode,12930845,315,84)
{
WorkPoints=#50:doOpen=Открывает текстовый файл для перебора строк|40:doStop=Останавливает перебор строк файла|
EventPoints=#55:onOpen=Выдает в поток очередную строку текстового файла|20:onEnd=Конец перебора|
VarPoints=#41:varString=содержит очередную строку файла|
DataPoints=#39:FileName=Полный путь к текстовому файлу|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|32:uses Windows, kol, Share, Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|9: private|16: str: string;|19: FStop: boolean;|8: public|13: FileName,|22: onOpen: THI_Event;|25: onEnd: THI_Event; |0:|50: procedure doOpen(var _Data:TData; index:word);|50: procedure doStop(var _Data:TData; index:word);|53: procedure varString(var _Data:TData; index:word);|5: end;|0:|14:implementation|29:procedure THiAsmClass.doOpen;|3:var|14: F: TextFile;|13: fn: string;|34: BufIn : Array[0..65535] of Char;|5:begin|39: fn := ReadString(_Data, FileName,'');|34: if not FileExists(fn) then exit;|20: AssignFile(F, fn);|11: Reset(F);|23: SetTextBuf(F, BufIn);|17: FStop := False;|35: while not eof(F) and not FStop do|7: begin|19: Readln(F, str);|29: _hi_onEvent(onOpen, str);|6: end;|15: CloseFile(F);|27: _hi_onEvent(onEnd, ''); |4:end;|0:|29:procedure THiAsmClass.doStop;|5:begin|16: FStop := true;|4:end;|0:|32:procedure THiAsmClass.varString;|5:begin|23: dtString(_Data, str);|4:end;|0:|4:end.|
link(onOpen,14692418:doNext,[])
link(onEnd,10171826:doText,[(389,97)(389,139)])
link(FileName,8021006:Text,[])
}
Add(Edit,8021006,315,35)
{
Left=25
Top=10
Width=550
Text="c:\"
}
Add(CounterEx,14692418,399,84)
{
Max=999999999
}

карма: 1

0
Ответов: 8885
Рейтинг: 823
#10: 2018-02-28 21:10:52 ЛС | профиль | цитата
miver, самый большой *.txt файл у меня нашёлся в 311 МБ, только без обработки перебрал все 5000000 строк за 18 мин
И строки-то короткие, по два числа в ASCII
ReadLn.jpg
карма: 19

0
Ответов: 758
Рейтинг: 112
#11: 2018-02-28 22:17:50 ЛС | профиль | цитата
Леонид, Вы их загрузили в форму? Только отрисовка убьёт кучу времени
карма: 1

0
Ответов: 8885
Рейтинг: 823
#12: 2018-02-28 23:25:33 ЛС | профиль | цитата
miver, нет, конечно, сначала в StrList, уже потом скопом на отрисовку


Add(MainForm,2953706,112,168)
{
}
Add(Button,13370250,112,119)
{
Left=15
Top=5
link(onClick,63447:doExecute,[])
}
Add(Label,10171826,448,224)
{
Left=95
Top=10
}
Add(InlineCode,12930845,245,126)
{
WorkPoints=#50:doOpen=Открывает текстовый файл для перебора строк|40:doStop=Останавливает перебор строк файла|
EventPoints=#55:onOpen=Выдает в поток очередную строку текстового файла|20:onEnd=Конец перебора|
VarPoints=#41:varString=содержит очередную строку файла|
DataPoints=#39:FileName=Полный путь к текстовому файлу|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|32:uses Windows, kol, Share, Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|9: private|16: str: string;|19: FStop: boolean;|8: public|13: FileName,|22: onOpen: THI_Event;|25: onEnd: THI_Event; |0:|50: procedure doOpen(var _Data:TData; index:word);|50: procedure doStop(var _Data:TData; index:word);|53: procedure varString(var _Data:TData; index:word);|5: end;|0:|14:implementation|29:procedure THiAsmClass.doOpen;|3:var|14: F: TextFile;|13: fn: string;|34: BufIn : Array[0..65535] of Char;|5:begin|39: fn := ReadString(_Data, FileName,'');|34: if not FileExists(fn) then exit;|20: AssignFile(F, fn);|11: Reset(F);|23: SetTextBuf(F, BufIn);|17: FStop := False;|35: while not eof(F) and not FStop do|7: begin|19: Readln(F, str);|29: _hi_onEvent(onOpen, str);|6: end;|15: CloseFile(F);|27: _hi_onEvent(onEnd, ''); |4:end;|0:|29:procedure THiAsmClass.doStop;|5:begin|16: FStop := true;|4:end;|0:|32:procedure THiAsmClass.varString;|5:begin|23: dtString(_Data, str);|4:end;|0:|4:end.|
link(onOpen,11457593:doAdd,[])
link(onEnd,7207750:doEvent1,[(284,139)(284,146)])
}
Add(ODialog,63447,161,119)
{
Filter="All|*.txt"
link(onExecute,15194973:doEvent1,[])
}
Add(ListBox,2835655,392,161)
{
Left=10
Top=40
Width=365
Height=220
}
Add(StrList,11457593,350,126)
{
}
Add(Hub,7207750,294,140)
{
OutCount=3
link(onEvent1,16633772:doData,[(340,146)(340,188)])
link(onEvent2,1139286:doStop,[(319,153)(319,230)])
link(onEvent3,11457593:doClear,[(326,160)(326,139)])
}
Add(DoData,16633772,350,182)
{
link(onEventData,2835655:doText,[])
link(Data,11457593:Text,[])
}
Add(Hub,15194973,210,119)
{
link(onEvent1,1139286:doStart,[(235,125)(235,223)])
link(onEvent2,12930845:doOpen,[])
}
Add(TimeCounter,1139286,350,217)
{
link(onStop,12140088:doString,[])
}
Add(FormatStr,12140088,399,224)
{
Mask="Выдано %1 строк за %2 мсек"
link(onFString,10171826:doText,[])
link(Str1,2835655:Count,[])
}

Эти 311 Мб StrList спокойно загружает за пару секунд. У компа 8 Гб памяти, надо попробовать, сколько влезет в StrList
карма: 19

0
Ответов: 758
Рейтинг: 112
#13: 2018-03-01 10:34:56 ЛС | профиль | цитата
Леонид, Вообще то я предлагал, что бы визуал отсутствовал

Add(MainForm,1565565,252,252)
{
Point(onClose)
link(onCreate,14931663:doOpen,[])
link(onClose,14931663:doClose,[])
}
Add(Button,13370250,245,112)
{
Left=15
Top=5
link(onClick,63447:doExecute,[])
}
Add(Label,10171826,623,224)
{
Left=95
Top=10
}
Add(InlineCode,12930845,385,126)
{
WorkPoints=#50:doOpen=Открывает текстовый файл для перебора строк|40:doStop=Останавливает перебор строк файла|
EventPoints=#55:onOpen=Выдает в поток очередную строку текстового файла|20:onEnd=Конец перебора|
VarPoints=#41:varString=содержит очередную строку файла|
DataPoints=#39:FileName=Полный путь к текстовому файлу|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|32:uses Windows, kol, Share, Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|9: private|16: str: string;|19: FStop: boolean;|8: public|13: FileName,|22: onOpen: THI_Event;|25: onEnd: THI_Event; |0:|50: procedure doOpen(var _Data:TData; index:word);|50: procedure doStop(var _Data:TData; index:word);|53: procedure varString(var _Data:TData; index:word);|5: end;|0:|14:implementation|29:procedure THiAsmClass.doOpen;|3:var|14: F: TextFile;|13: fn: string;|34: BufIn : Array[0..65535] of Char;|5:begin|39: fn := ReadString(_Data, FileName,'');|34: if not FileExists(fn) then exit;|20: AssignFile(F, fn);|11: Reset(F);|23: SetTextBuf(F, BufIn);|17: FStop := False;|35: while not eof(F) and not FStop do|7: begin|19: Readln(F, str);|29: _hi_onEvent(onOpen, str);|6: end;|15: CloseFile(F);|27: _hi_onEvent(onEnd, ''); |4:end;|0:|29:procedure THiAsmClass.doStop;|5:begin|16: FStop := true;|4:end;|0:|32:procedure THiAsmClass.varString;|5:begin|23: dtString(_Data, str);|4:end;|0:|4:end.|
link(onOpen,14722244:doHashsum,[])
link(onEnd,7207750:doEvent1,[])
}
Add(ODialog,63447,294,112)
{
Filter="All|*.txt"
link(onExecute,15194973:doEvent1,[])
}
Add(Hub,7207750,434,133)
{
OutCount=3
link(onEvent1,9593968:doExec,[])
link(onEvent2,13045864:doQuery,[(466,146)(466,181)])
link(onEvent3,1139286:doStop,[(459,153)(459,230)])
}
Add(Hub,15194973,343,112)
{
OutCount=3
link(onEvent1,1139286:doStart,[(375,118)(375,223)])
link(onEvent2,6607539:doExec,[(368,125)(368,90)])
link(onEvent3,12930845:doOpen,[])
}
Add(TimeCounter,1139286,525,217)
{
link(onStop,12140088:doString,[])
}
Add(FormatStr,12140088,574,224)
{
Mask="Выдано %1 строк за %2 мсек"
link(onFString,10171826:doText,[])
link(Str1,16717458:Value,[])
}
Add(DS_SQLite,14931663,308,266)
{
@Color=5635925
Name="DB"
FileName=":memory:"
link(onOpen,9656551:doExec,[])
}
Add(Hashsum,14722244,525,126)
{
link(onResult,6489984:doString,[])
}
Add(DSC_Exec,9656551,364,266)
{
@Color=5635925
SQL="CREATE TABLE hashtub(\r\n[hash] TEXT);"
DSManager="DB"
}
Add(DSC_Exec,6607539,385,84)
{
@Color=5635925
SQL="BEGIN TRANSACTION;"
DSManager="DB"
}
Add(DSC_Exec,9593968,476,133)
{
@Color=5635925
SQL="END TRANSACTION;"
DSManager="DB"
}
Add(DSC_Exec,733540,623,126)
{
@Color=5635925
DSManager="DB"
}
Add(FormatStr,6489984,574,126)
{
DataCount=1
Mask="INSERT INTO hashtub values('%1');"
link(onFString,733540:doExec,[])
}
Add(Memory,16717458,574,175)
{
}
Add(DSC_Query,13045864,525,175)
{
@Color=5635925
SQL="SELECT count(*) FROM hashtub;"
DSManager="DB"
link(onQuery,16717458:doValue,[])
}

карма: 1

0
Ответов: 16884
Рейтинг: 1239
#14: 2018-03-01 10:43:45 ЛС | профиль | цитата
Леонид, miver прав.
Судя по схеме, 18 минут - время загрузки в StrList + время загрузки в ListBox + время отрисовки.
Насчёт БД miver тоже прав.
Если применить SQLite то (теоретически) размер файла 140 Тб , но эта цифра зависит от версии SQLite3.dll
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 758
Рейтинг: 112
#15: 2018-03-01 10:49:11 ЛС | профиль | цитата
Вот выбор уникальных строк в памяти через БД. Если памяти навалом то сделает очень быстро

Add(MainForm,1565565,252,252)
{
Point(onClose)
link(onCreate,14931663:doOpen,[])
link(onClose,14931663:doClose,[])
}
Add(Button,13370250,245,112)
{
Left=15
Top=5
link(onClick,63447:doExecute,[])
}
Add(Label,10171826,623,224)
{
Left=95
Top=10
}
Add(InlineCode,12930845,385,126)
{
WorkPoints=#50:doOpen=Открывает текстовый файл для перебора строк|40:doStop=Останавливает перебор строк файла|
EventPoints=#55:onOpen=Выдает в поток очередную строку текстового файла|20:onEnd=Конец перебора|
VarPoints=#41:varString=содержит очередную строку файла|
DataPoints=#39:FileName=Полный путь к текстовому файлу|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|32:uses Windows, kol, Share, Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|9: private|16: str: string;|19: FStop: boolean;|8: public|13: FileName,|22: onOpen: THI_Event;|25: onEnd: THI_Event; |0:|50: procedure doOpen(var _Data:TData; index:word);|50: procedure doStop(var _Data:TData; index:word);|53: procedure varString(var _Data:TData; index:word);|5: end;|0:|14:implementation|29:procedure THiAsmClass.doOpen;|3:var|14: F: TextFile;|13: fn: string;|34: BufIn : Array[0..65535] of Char;|5:begin|39: fn := ReadString(_Data, FileName,'');|34: if not FileExists(fn) then exit;|20: AssignFile(F, fn);|11: Reset(F);|23: SetTextBuf(F, BufIn);|17: FStop := False;|35: while not eof(F) and not FStop do|7: begin|19: Readln(F, str);|29: _hi_onEvent(onOpen, str);|6: end;|15: CloseFile(F);|27: _hi_onEvent(onEnd, ''); |4:end;|0:|29:procedure THiAsmClass.doStop;|5:begin|16: FStop := true;|4:end;|0:|32:procedure THiAsmClass.varString;|5:begin|23: dtString(_Data, str);|4:end;|0:|4:end.|
link(onOpen,6489984:doString,[])
link(onEnd,7207750:doEvent1,[])
}
Add(ODialog,63447,294,112)
{
Filter="All|*.txt"
link(onExecute,15194973:doEvent1,[])
}
Add(Hub,7207750,434,133)
{
OutCount=3
link(onEvent1,9593968:doExec,[])
link(onEvent2,13045864:doQuery,[(466,146)(466,181)])
link(onEvent3,1139286:doStop,[(459,153)(459,230)])
}
Add(Hub,15194973,343,112)
{
OutCount=3
link(onEvent1,1139286:doStart,[(375,118)(375,223)])
link(onEvent2,6607539:doExec,[(368,125)(368,90)])
link(onEvent3,12930845:doOpen,[])
}
Add(TimeCounter,1139286,525,217)
{
link(onStop,12140088:doString,[])
}
Add(FormatStr,12140088,574,224)
{
Mask="Выдано %1 строк за %2 мсек"
link(onFString,10171826:doText,[])
link(Str1,16717458:Value,[])
}
Add(DS_SQLite,14931663,308,266)
{
@Color=5635925
Name="DB"
FileName=":memory:"
link(onOpen,9656551:doExec,[])
}
Add(DSC_Exec,9656551,364,266)
{
@Color=5635925
SQL="CREATE TABLE hashtub(\r\n[hash] TEXT UNIQUE);"
DSManager="DB"
}
Add(DSC_Exec,6607539,385,84)
{
@Color=5635925
SQL="BEGIN TRANSACTION;"
DSManager="DB"
}
Add(DSC_Exec,9593968,476,133)
{
@Color=5635925
SQL="END TRANSACTION;"
DSManager="DB"
}
Add(DSC_Exec,733540,574,126)
{
@Color=5635925
DSManager="DB"
}
Add(FormatStr,6489984,525,126)
{
DataCount=1
Mask="INSERT INTO hashtub values('%1');"
link(onFString,733540:doExec,[])
}
Add(Memory,16717458,574,175)
{
}
Add(DSC_Query,13045864,525,175)
{
@Color=5635925
SQL="SELECT count(*) FROM hashtub;"
DSManager="DB"
link(onQuery,16717458:doValue,[])
}

карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)