3

大きなテキスト ファイル (主にログ ファイル) を処理する PHP スクリプトがあります。問題は、ほとんどの場合、ある分割ポイントから別の分割ポイントまでのセクションのみが必要なことです。しかし、2 GB のテキスト ファイルを読み取ってその一部を取得するだけでは、プロセスが遅くなります。

ファイル全体をメモリに読み込まずに、テキストの一部だけを読み取る方法はありますか?

データは次のように保存されます。

|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 データベースはオプションではありません。ファイルを小さなファイルに分割することも実用的ではありません。

4

1 に答える 1

2

fseekを探していると思います。

ただし、X 番目の文字が 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);

これが役立つことを願っています。

于 2013-05-24T18:23:54.713 に答える