У меня общий вопрос по вашему мнению о моей «технике».
Есть 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 Теперь я сначала разделил огромные файлы, чтобы у меня не было проблем с нехваткой памяти. Я также думаю, что быстрее сравнивать (много) файлов меньшего размера друг с другом, чем эти два огромных файла. После этого я могу сравнивать их так, как я упоминал выше. Возможно, это не лучший способ, но я все еще учусь ;-) Тем не менее, все ваши подходы были мне очень полезны, спасибо за ваши ответы!