Прочитайте длинную строку в память - PullRequest
1 голос
/ 01 октября 2010

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

Спасибо

Ответы [ 4 ]

4 голосов
/ 01 октября 2010

Откуда берется ваша большая струна?Поскольку вы говорите, что читаете это, я предполагаю, что это происходит из файла.Вы должны знать всю строку, чтобы знать, где ее разбить?Если нет, вы можете просто прочитать файл char за символом, пока не достигнете маркера разделения, поместите все прочитанные до сих пор символы в строку и начните читать следующую строку.Вы бы примерно знали, где отсортировать только что прочитанную строку?Если это так, вы можете записать частичные строки в отдельные файлы (например, все строки, начинающиеся с буквы A, переходят к A.tmp при сортировке строк по алфавиту) при первом запуске.После этого вы можете отсортировать (надеюсь, теперь достаточно маленький, чтобы уместить в вашей памяти) содержимое созданных файлов и, наконец, добавить содержимое в новый выходной файл.

2 голосов
/ 01 октября 2010

Если вы ограничены памятью, вы можете попробовать применить сортировку слиянием, иначе увеличьте размер кучи, используя параметры виртуальной машины -Xmx и -Xms

1 голос
/ 01 октября 2010

Если вы хотите, чтобы Hadoop обрабатывал лог-файл Apache размером 100 ГиБ «построчно», вы, по сути, делаете то же, что и вы: большой текст, разбитый на части.

Обычный способ сделать это в Hadoop (как вы пометили вопрос этим) - использовать TextInputFormat , который использует LineRecordReader , который использует LineReader для разделения Текстовый файл с разделителем конца строки. То, что вы хотите, по сути то же самое с одним отличием: разделить на что-то другое.

Сортировка результирующих значений (в Hadoop) по существу выполняется путем использования так называемой «Вторичной сортировки» ( См. Пример Hadoop и объяснение в книге Тома ).

Так что я бы порекомендовал сделать это

  1. Создайте свой собственный вариант для TextInputFormat / LineRecordReader / LineReader , который считывает и извлекает отдельные части вашей строки на основе вашего разделителя.
  2. Создайте карту, которая переписывает информацию для выполнения вторичной сортировки.
  3. Создайте правильные классы / методы сравнения разделов, групп и ключей для сортировки.
  4. Создайте сокращение, где вы получите отсортированную информацию, которую вы можете обработать дальше.

НТН

0 голосов
/ 01 октября 2010

Вы можете посмотреть на Внешние алгоритмы сортировки

...