Войти

Показать полную графическую версию : Помогите решить на чём писать.


Eugene Shugaev
20-04-2014, 15:18
И так у меня есть задачя:
- у нас есть два файла, в формате txt и каждый размеров 15 гиг. В них в столбик идут пароли, около 1,5 миллиарда в каждом. Задача: нужно проанализировать эти файлы на наличие одинаковых строчек (то есть построчное чтение из двух фалов по 1 строке и каждого за 1 такт) и если строки разные то записать из оби в файл out.txt а если одинаковые то удалить одну из них а вторую записать в тотже файл.
Знания языков программирования по шкале от 0 до 3 (где 0 - это ничего, а 3 - пишу программы, средние):
- pascal (1)
- С++ (1)
- .bat (2)
Я хочю совет: на каком языке мне лучше это писать, и какой учить.???

VitProff
20-04-2014, 15:43
Это будет очень долго с файлами
каждый размеров 15 гиг. »

На Delphi есть готовые программы с таким функционалом, например "workwithtext by alex ey" (Эта программа работает з базами паролей для брута, ссылку не даю так как не знаю запрещено ли здесь давать ссылки на хак-программы)

Eugene Shugaev
20-04-2014, 15:54
Да спасибо)) Дельна прога, только в коментариях написано что она с трудом базы на 300 мб кушает, а тут на 30 гб((((

Iska
20-04-2014, 18:17
Eugene Shugaev, выложите образцы исходных файлов (небольшого размера, в той же кодировке, что и оригинальные) и результирующего.

pva
22-04-2014, 21:20
имхо комбинация sort http://www.opennet.ru/man.shtml?topi...A%C1%D4%D8+man и uniq http://www.opennet.ru/man.shtml?topi...ry=1&russian=0 справится на ура

Varox
19-06-2014, 14:35
Конечно слегка оффтоп, но еслиб передо мной стояла такая задача, я бы ударил по ней всей мощью perl. Ну или да на bash как господин pva предлагает, тем более что в bashe инструментов предостаточно для таких вот задач. А С++ или Pascal для такой фигни не стал бы использовать, если конечно не нужно эту задачу решать часто и быстро.

Вот покурил минут 5 вот такой код:

#find_eq.pl

my $fn1 = "file1_15gb.txt"; #имя первого файла
my $fn2 = "file2_15gb.txt"; #имя второго файла
my $outfile = "out.txt"; #имя выходного файла

open FILE1,"$fn1" or die; #открываем файлы на чтение
open FILE2,"$fn2" or die;
open OUT,">$outfile" or die; #открываем выходной файл на запись

while (not eof) { #выполняем пока не конец одного из фалов
$str1 = <FILE1>; # читайем строчки их фалов в переменные str1 и str2
$str2 = <FILE2>;
chomp($str1); # убираем символы конца строки
chomp($str2);

#если строки не совпадают то пишем на выход
#с указанием из какого файла все прочитано
if (not($str1 eq $str2)){
print OUT "$fn1 - $str1\n";
print OUT "$fn2 - $str2\n";
}
}


мощи Perl конечно в коде немного, и на файлах он 15 гиговых не проверялся, но думается мне работать будет, но долго, зато написано за 5 минут.:)

navuhodonosor
01-07-2014, 15:27
Не совсем понятно, тебе нужно сравнить строчки в принципе (т.е. 1 строка 1 файла = 1 строке 2 файла и тд.) или надо сравнить так (1 строка 1 файла = любой строке 2 файла)?
Ну я не очень силен в разработке, но приходилось большие файлы обрабатывать и сравнивать, правда не такие большие (до 4 ГБ).
Если вариант 1 нужен то по барабану вообще, главное читать построчно.
Если вариант 2, то главное не pascal, я бы например использовал какой-нибудь dictionary и туда загрузил все из первого а потом второй построчно проверял, механизм поиска в словаре довольно быстро работает.

Iska
02-07-2014, 02:30
Если вариант 2, то главное не pascal, я бы например использовал какой-нибудь dictionary и туда загрузил все из первого а потом второй построчно проверял, механизм поиска в словаре довольно быстро работает. »
navuhodonosor, с такими объёмами:
и каждый размеров 15 гиг. »
— никаких словарей. Только базы данных и запросы.

navuhodonosor
02-07-2014, 09:52
Согласен, БД для этого и нужны. Но иногда задачи ставятся так, что БД применить нельзя, мне приходилось писать макросы на VBA, как раз потому, что Excel не позволял импортировать файлы, слишком много значений, больше 1048576. Как раз тут меня и выручили словари, делал их несколько, в каждом было порядка миллиона ключей, поиск по словарю очень порадовал))) в итоге вся обработка средствами VBA занимала около 5 минут.
По поводу миллиардов строк данных, конечно не пробовал, не знаю способен ли словарь поместить такое и какой нужен для этого объем ОЗУ.

Iska
02-07-2014, 10:17
Но иногда задачи ставятся так, что БД применить нельзя, »
Я потому и пытался добиться от автора образцов текстовых файлов:
Eugene Shugaev, выложите образцы исходных файлов (небольшого размера, в той же кодировке, что и оригинальные) и результирующего. »
дабы оценить возможность применения OLE DB Text Driver или Log Parser.

По поводу миллиардов строк данных, конечно не пробовал, не знаю способен ли словарь поместить такое и какой нужен для этого объем ОЗУ. »
Очень условно можно считать по количеству символов. То есть, если принять, что мы используем x64-разрядную ОС, соответствующий инструментарий — мы в любом случае ограничены сверху объёмом свободной памяти. Всё, что больше — пойдёт вытесняться в виртуальную память с соответствующим диким «проседанием» производительности. Посему — БД. Даже если надо будет предварительно создать эту БД и конвертировать текстовые файлы в её таблицы.

User001
02-07-2014, 14:23
Я потому и пытался добиться от автора образцов текстовых файлов »Может, уже кто-нибудь сгенерит такие файлы, да попробуем все способы? :)




© OSzone.net 2001-2012