У меня есть PHP-скрипт, который много работает с большими текстовыми файлами, в основном с файлами журналов. Проблема в том, что большую часть времени я хочу только часть ее, от одной точки разделения до другой. Но для чтения текстового файла объемом 2 ГБ только для получения небольшой порции это замедляет процесс.
Есть ли способ читать только части текста без необходимости читать весь файл в памяти?
Данные хранятся следующим образом:
|18.05.2013: some log info here... |19.05.2013: some log info here... |20.05.2013: some log info here... |21.05.2013: some log info here... |22.05.2013: some log info here... | etc...
Поэтому, если бы я хотел только «19.05.2012», мне все равно пришлось бы прочитать и весь другой текст. Есть ли способ читать только эту часть?
PS База данных не является опцией, разделение файлов на более мелкие файлы также нецелесообразно.
Я думаю, вы ищете fseek .
Тем не менее, вам нужно будет форматировать свои данные таким образом, чтобы Xth-символ стал началом Y-данных. Практически, если каждый журнал может иметь одинаковую длину, это может быть эффективным способом. В противном случае вам все равно нужно прочитать все строки, чтобы их найти.
Представим себе (непроверенный, но только для того, чтобы вы начали):
function getDataFromFile($fileName, $start, $length) { $f_handle = fopen($filename, 'r'); fseek($f_handle, $start); $str = fgets($length); fclose($f_handle); return $str; }
Затем:
$fname='myfile.txt'; $DATA_LENGTH = 50; $wanted_data = 12; $data = getDataFromFile($fname, $DATA_LENGTH*$wanted_data, $DATA_LENGTH);
Надеюсь, это поможет.