| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Сравнения больших файлов |
| Автор: Gazprom 10.4.2009, 18:39 | ||
| Доброе время суток. Есть такая задачка. Требуется сравнить строки в двух файлах. На выходе должны быть созданы 2 файла, в первом будут строки которые не содержаться во втором и наоборот. Данную задача решена мною была
Но вот есть ще два условия которые меня загоняют в тупик(( 1)размер исходных файлов неизвестен. Возможно, что они будут настолько большие, что их нельзя будет загрузить в память, построить по ним в памяти хэш или дерево и т.д. 2) известно, что строки в обоих входных файла отсортированы в одинаковом лексографическом порядке Подскажи какую нить идею для решения... |
| Автор: tolkien 11.4.2009, 03:22 |
| Если памяти не хватает. Тогда грузите файлы небольшими кусочками. |
| Автор: Gazprom 13.4.2009, 09:19 | ||
Данная задача больше является теоретической, чем практической=(
Как примерно это делается? И мож ноли будет брать определенные куски файла, например все которые начинаются на определенный символ? (в файле строки отсортированы) |
| Автор: amg 13.4.2009, 10:05 |
| А зачем кусками файлы зачитывать? Можно каждый раз по одной строке. Зачтываем по строке из каждого файла, сравниваем их оператором cmp, в зависимости от результата сравнения 0: пропускаем эти строки (они одинаковые) 1: читаем следующую строку из первого файла (или из второго, см. справку по cmp) -1: читаем следующую строку из второго файла Как то так, реализовать, вроде, несложно. |
| Автор: Gazprom 13.4.2009, 14:48 | ||||
Так и сделал, вроде получилось. Вот хотелось бы чтоб прокомментировать, если есть какие нить недоработки, хотя ои скорей всего есть!!1 Заранее спасибо
|
| Автор: sir_nuf_nuf 13.4.2009, 20:54 |
| Тут есть тонкость: Что значит "нет во втором файле" ? Нет вообще ? Тогда в любом случае вам для того что бы определить что строки нет в файле нужно его полностью просмотреть, а он в память не поместится.. В Случае если файлы отсортированы, так что строки в порядке возрастания - то решение предложил товарищ amg Таким образом для вас задача сводится к сортировке очень большого файла. Это называется внешняя сортировка и описана хорошо в книжке Дональда Кнута |
| Автор: amg 14.4.2009, 04:56 |
| Gazprom, перед безусловным зачитыванием строки из файла необходимо делать проверку на конец файла if (eof($input1)) {...} и не пытаться зачитывать очередную строку, если файл уже кончился. |