Две точки должны быть сделаны:
- Чтобы сделать это вы должны создать метаданные о содержимом текстового файла, чтобы амортизировать работу. Таким образом, вы можете напрямую пропустить бит, который вам нужен, запросив с помощью
file:position/2
после, вы создали эти метаданные.
- Если это ваш прецедент, вы должны разделить работу по-разному. Огромные текстовые файлы должны быть разбиты на более мелкие текстовые файлы, или (более вероятно), что вы не должны использовать текстовые файлы вообще. В зависимости от вашей цели (что вы не упомянули, я сильно подозреваю, что это проблема X-Y), вы, вероятно, не хотите текст вообще, а скорее хотите знать что-то, представленное текстом. Это может быть хорошей идеей, чтобы сохранить исходный текст где-то на всякий случай, но для фактической обработки данных это почти наверняка лучшая идея для создания символических данных, которые (гораздо более кратко) представляют все, что вам интересно узнать о данных, и хранить это в базе данных, где поиск, сканирование, индексирование и выполнение любых других вещей, которые могут потребоваться, - это естественные операции.
Для создания метаданных о файлах, вам нужно будет сделать что-то аналогичное:
1> {ok, Data} = file:read_file("TheLongDarkTeaTimeOfTheSoul.txt").
{ok,<<"Douglas Adams. The Long Dark Tea-Time of the Soul\r\n\r\n"...>>}
2> LineEnds = binary:matches(Data, <<"\r\n">>).
[{49,2},
{51,2},
{53,2},
{...}|...]
А затем сохранить LineEnds
где-то отдельно, как мета о самом файле. Использование этого поиска в файлах данных является элементарным (например, использовать file:position/2
с данными в строкеbreak X или length(LineEnds) - X
или что-то еще).
Но это все еще глупо.
Если вы хотите прыгать в лог-файлах, и особенно если вы хотите найти в них шаблоны, посчитайте некоторые их аспекты и т. Д.то вы почти наверняка лучше прочитали бы их в базу данных, такую как Postgres, за строкой, подсчитывая номера строк по мере их поступления. В этот момент разбиение на страницы становится тривиальной проблемой.
Журнальные файлы, однако, обычно заполнены данными, которые лучше всего представлены символами, а не фактическим текстом, и, вероятно, еще более предпочтительной идеей является токенизация файла журнала. Рассмотрим случай файлов журнала доступа. Повторяющееся количество посетителей получает доступ из конечного числа точек доступа (IP-адресов, устройств или любого другого) произвольным числом раз. Каждый аспект этого можно отдельно индексировать и сравнивать довольно тривиально в базе данных. Сама же токенизация довольно тривиальна. Мало того, что это решение много быстрее, когда дело доходит до более позднего анализа данных, но оно естественным образом отвечает на ответ очень сложно ответить на вопросы о содержимом данных в очень прямолинейном и знакомом виде. ... И вам даже не нужно терять какие-либо необработанные данные или промежуточные этапы обработки (которые могут быть независимо полезны по-разному).
Также ... обратите внимание, что все вышеуказанные работы могут быть легко выполнены параллельно в Эрланге. Независимо от ситуации с вашими вычислительными ресурсами, написание решения, которое наилучшим образом использует ваше оборудование, безусловно, находится в пределах понимания (при условии, что у вас достаточно общих данных, что это даже проблема).
Как и многие «Как сделать X с данными Y?» вопросы, настоящий ответ всегда будет вращаться вокруг «Какова ваша цель в отношении данных и почему?»
Каков фактический вопрос? –
вопрос: как я могу получить строки текста с заданной позицией файла, но с их перечислением с конца файла. Я вижу, что мне нужно упростить текст, о котором идет речь. – nayana
@AdamLindberg ok Я полностью отреставрирован вопрос и упрощен до одного вопроса .. – nayana