У меня есть текстовый файл со словом в каждой строке, размер файла 800 ГБ. Мне нужно отсортировать слова в алфавитном порядке.
Я попытался с помощью программы сортировки Windows, используя:
sort.exe input.txt /o output.txt
что выдает ошибку: Недостаточно основной памяти для завершения сортировки.
У меня 32 ГБ оперативной памяти, поэтому, когда я пытаюсь указать 10 ГБ памяти для сортировки, используя:
sort.exe input.txt /o output.txt /M 10000000
Я получил:
Предупреждение: указанный объем памяти уменьшается до доступной памяти подкачки.
Входная запись превышает максимальную длину. Укажите больший максимум.
Какие у меня варианты?
Ответы:
Какие у меня варианты?
Попробуйте бесплатную утилиту сортировки командной строки CMSort .
Он использует несколько временных файлов, а затем объединяет их в конце.
Один пользователь сообщает, что отсортировал файл размером 130 000 000 байт.
Если вы хотите настроить некоторый код самостоятельно, есть также Сортировка огромных текстовых файлов - CodeProject - «Алгоритм сортировки строк в текстовых файлах, размер которых превышает доступную память»
источник
--parallel
вариант, если у вас более одного ядра ...)?Еще один вариант - загрузить файл в базу данных. Например, MySQL и MySQL Workbench.
Базы данных являются идеальными кандидатами для работы с большими файлами
Если ваш входной файл содержит только слова, разделенные новой строкой, это не должно быть сложно.
После того, как вы установили базу данных и MySQL Workbench, это то, что вам нужно сделать.
Сначала создайте схему (предполагается, что слова не будут длиннее 255 символов, хотя вы можете изменить это, увеличив значение аргумента). Первый столбец «idwords» является первичным ключом.
Во-вторых, импортируйте данные: EG Это импортирует все слова в таблицу (этот шаг может занять некоторое время. Мой совет - сначала запустить тест с небольшим файлом слов, и как только вы убедитесь, что формат такой же, как больший (обрежьте таблицу. IE очистите ее и загрузите полный набор данных).
Эта ссылка может помочь получить правильный формат для загрузки. https://dev.mysql.com/doc/refman/5.7/en/load-data.html
EG. Если вам нужно пропустить первую строку, вы должны сделать следующее.
Наконец сохраните отсортированный файл. Это может занять некоторое время, в зависимости от вашего компьютера.
Вы также можете искать данные по своему усмотрению. EG Это даст вам первые 50 слов в порядке возрастания (начиная с 0-го или первого слова).
Удачи
Пит
источник
mywords
будет длиться вечно. Даже с этимLIMIT
, это займет столько же времени, сколько и все, потому что MySQL должен будет пройти через все значенияmywords
и упорядочить их. Чтобы это исправить, вы должны сделать следующее после того, как вы это сделалиLOAD DATA
. Добавить индекс вmywords
. Теперь вы можете заказать по этой колонке, а не сделать это через тысячелетия. И это лучше , чтобы добавить индекс после загрузки данных , а не в то время , вы создали таблицу (намного быстрее загрузки данных).sort
Существует много алгоритмов, используемых для сортировки упорядоченных и не упорядоченных файлов [ 1 ] .
Поскольку все эти алгоритмы уже реализованы, выберите программу, уже протестированную.
В coreutils (из Linux, но доступно и для Windows [ 2 ] ) существует
sort
команда, способная работать параллельно под многоядерными процессорами: обычно этого достаточно.Если ваш файл настолько велик, вы можете помочь в обработке splitting (
split -l
), файла в некоторых чанках, возможно, с помощью опции Parallel (--parallel
) и сортировке полученных упорядоченных чанков с помощью-m
опции ( сортировка слиянием ).Один из многих способов сделать это объясняются здесь (разделение файлов, одиночные чушки порядка, слияние упорядоченных ломтей, удалять временные файлы).
Заметки:
(Например, пузырьковая сортировка - это самый быстрый алгоритм для уже упорядоченного файла - ровно N, но в других случаях он неэффективен).
источник
Чтобы предложить альтернативное решение для Peter H, существует программа q, которая позволяет использовать команды в стиле SQL для текстовых файлов. Команда ниже будет делать то же самое (запускаться из командной строки в том же каталоге, что и файл), без необходимости устанавливать SQL Workbench или создавать таблицы.
c1
является сокращением для столбца 1.Вы можете исключить повторяющиеся слова с
и отправить вывод в другой файл
источник
Если слова в каждой строке взяты из ограниченного словаря (например, английского), вы можете отсортировать список за O (n + m log m), используя TreeMap и количество записей (где m - количество уникальных значений).
В противном случае вы можете использовать java-библиотеку big-sorter . Он разбивает входные данные на отсортированные промежуточные файлы и эффективно объединяет их (в целом O (nlogn)). Сортировка вашего файла выглядит следующим образом:
Я создал файл объемом 1,7 ГБ (100 м строк) со случайно сгенерированными 16-символьными словами и отсортировал его, как указано выше, в 142-х годах и основываясь на вычислительной сложности O (n log n) метода, который я использую, я оцениваю, что 800 ГБ из 16-ти символов символов займет около 24 часов, чтобы отсортировать однопоточные на моем ноутбуке i5 2.3 ГГц с SSD.
источник