Сжать КАЖДУЮ СТРОКУ файла отдельно и независимо друг от друга? (или сохранить переводы строки) - PullRequest
2 голосов
/ 22 июня 2011

У меня есть очень большой файл (~ 10 ГБ), который можно сжать до <1 ГБ с помощью gzip. Я заинтересован в использовании сортировки FILE | uniq -c | сортировка, чтобы увидеть, как часто повторяется одна строка, однако файл размером 10 ГБ слишком велик для сортировки, и на моем компьютере не хватает памяти. </p>

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

Или любой другой метод определения / подсчета того, сколько раз каждая строка повторяется внутри большого файла (CSV-подобный файл ~ 10 ГБ)?

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 23 июня 2011

Вы уверены, что у вас заканчивается память (ОЗУ) с вашим sort?

Мой опыт отладки проблем sort заставляет меня думать, что вам, вероятно, не хватило места на диске для sort, чтобы создать временные файлы. Также помните, что дисковое пространство, используемое для сортировки, обычно находится в /tmp или /var/tmp.

Итак, проверьте доступное место на диске с помощью:

df -g 

(некоторые системы не поддерживают -g, попробуйте -m (мегабайт) -k (килобайт))

Если у вас небольшой раздел /tmp, есть ли у вас другой раздел с 10-20 ГБ свободного? Если да, то скажите вашему виду использовать этот каталог с

 sort -T /alt/dir

Обратите внимание, что для сортировки версии

sort (GNU coreutils) 5.97

Помощь говорит

 -T, --temporary-directory=DIR  use DIR for temporaries, not $TMPDIR or /tmp;
                          multiple options specify multiple directories

Я не уверен, что это средство может объединить кучу -T=/dr1/ -T=/dr2 ..., чтобы добраться до вашего 10GB * пространства sortFactor или нет. По моему опыту, он использовал только последний каталог в списке, поэтому попробуйте использовать достаточно большой каталог.

Также обратите внимание, что вы можете перейти к тому каталогу, который вы используете для сортировки, и вы увидите активность временных файлов, используемых для сортировки.

Надеюсь, это поможет.

Поскольку вы, кажется, являетесь новым пользователем здесь на S.O., позвольте мне поприветствовать вас и напомнить вам о четырех вещах, которые мы делаем:

. 1) Читать часто задаваемые вопросы

. 2) Пожалуйста, примите ответ, который наилучшим образом решит вашу проблему, нажав на галочку . Это дает респонденту с лучшим ответом 15 баллов репутации. Он не вычитается (как некоторые думают) из вашей репутации; -)

. 3) Когда вы видите хорошие вопросы и ответы, оцените их, используя серые треугольники , поскольку доверие к системе основано на репутации, которую пользователи получают, делясь своими знаниями.

. 4) Получая помощь, постарайтесь также оказать ей помощь, отвечая на вопросы в вашей области знаний

0 голосов
/ 22 июня 2011

Есть несколько возможных решений:

1 - используйте любой язык обработки текста (perl, awk), чтобы извлечь каждую строку и сохранить номер строки и хеш для этой строки, а затем сравнить хэши

2 - Можно / Хотите удалить дубликаты строк, оставляя только один случай на файл? Могли бы использовать скрипт (команду) вроде: awk '! x [$ 0] ++' oldfile> newfile

3 - Почему бы не разбить файлы, но по некоторым критериям? Предположим, что все ваши строки начинаются с букв: - разбить ваш оригинальный_файл на 20 небольших файлов: grep "^ a * $" original_file> a_file - сортировать каждый маленький файл: a_file, b_file и т. д. - проверяй дубликаты, считай их, делай что хочешь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...