Как сравнивать большие текстовые файлы?

У меня общий вопрос по вашему мнению о моей «технике».

Есть 2 текстовых файла ( file_1 и file_2 ), которые необходимо сравнить друг с другом, оба очень огромны (3-4 гигабайта, от 30 000 000 до 45 000 000 строк каждая). Моя идея состоит в том, чтобы прочитать несколько строк (как можно больше) из file_1 в память, а затем сравнить их с всеми строками file_2 . Если есть совпадение, строки из обоих файлов, которые совпадают, должны быть записаны в новый файл. Затем перейдите к следующим 1000 строкам file_1 и сравните их со всеми всеми строками file_2 , пока я полностью не прохожу file_1 .

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

Как вы думаете, сколько времени может занять сравнение? Для моей программы время не имеет большого значения. У меня нет опыта работы с такими огромными файлами, поэтому я не знаю, сколько времени это может занять. Однако это не должно занять больше дня. ;-) Но я боюсь, что моя техника может занять вечность ...

Другой вопрос, который только что пришел мне в голову: сколько строк вы бы прочитали в памяти? Как можно больше? Есть ли способ определить количество возможных строк, прежде чем пытаться это сделать? Я хочу прочитать как можно больше (потому что я думаю, что это быстрее), но мне часто не хватает памяти.

Заранее спасибо.

РЕДАКТИРОВАТЬ Я думаю, мне нужно объяснить мою проблему немного подробнее.

Цель не в том, чтобы увидеть, идентичны ли два файла в целом (а это не так). В каждом файле есть несколько строк, имеющих одну и ту же «характеристику». Вот пример: file_1 выглядит примерно так:

mat1 1000 2000 TEXT      //this means the range is from 1000 - 2000
mat1 2040 2050 TEXT
mat3 10000 10010 TEXT
mat2 20 500 TEXT

file_2 выглядит так:

mat3 10009 TEXT
mat3 200 TEXT
mat1 999 TEXT

ТЕКСТ относится к символам и цифрам, которые меня не интересуют, mat можно перейти от mat1 - mat50 и не в порядке; также может быть 1000x mat2 (но числа в следующем столбце другие). Мне нужно найти подходящие линии таким образом, чтобы:matX одинаков в обеих сравниваемых строках, а число, указанное в file_2 , попадает в диапазон, указанный в file_1 . Итак, в моем примере я нашел бы одно совпадение: строка 3 из file_1 и строка 1 из file_2 (потому что оба являются mat3, а 10009 находится между 10000 и 10010). Надеюсь, это проясняет вам!

Итак, мой вопрос: как вы будете искать совпадающие строки?

Да, я использую Java в качестве языка программирования.

EDIT Теперь я сначала разделил огромные файлы, чтобы у меня не было проблем с нехваткой памяти. Я также думаю, что быстрее сравнивать (много) файлов меньшего размера друг с другом, чем эти два огромных файла. После этого я могу сравнивать их так, как я упоминал выше. Возможно, это не лучший способ, но я все еще учусь ;-) Тем не менее, все ваши подходы были мне очень полезны, спасибо за ваши ответы!

9
задан Grrace 19 August 2011 в 12:45
поделиться