2011-09-14 16 views
0

私は解決策を見つけるためにインターネット上を探索しました。それらのすべてが重要な問題を無視している。最高の解決策は、スタックオーバーフローであったファイルをx行からy行に読み込む方法(PHPで)

$file = new SplFileObject('longFile.txt'); 
    $fileIterator = new LimitIterator($file, 1000, 2000); 
    foreach($fileIterator as $line) { 
    echo $line, PHP_EOL; 
    } 

しかし、他のアプローチのように、これはオフセットラインに到達するためにファイルの先頭から読み取る必要があります。通常、それは無視できる。しかし、大きなファイル(例えば、何百万行ものファイル)では、プロセスが大幅に遅くなります。時間は、オフセットの増加によって単調増加する。オフセットを数百万に設定すると、処理時間は数秒になります。

データベース(mysqlなど)では、データベース全体を見ずに行を読み取るようにテーブルのインデックスを作成します。ファイルキー(行番号)でそのようなことをする必要はありますか?私はSQLiteやBerkeley DBのようなフラットファイルデータベースがどのようにテーブルのインデックスを作成するのだろうかと思います。

答えて

1

ここでの概念的な問題は、ファイルが文字列であり、その文字の一部が行末を示すことです。そのため、最初にファイルを読み込まずに行の始まりと終わりを知ることは不可能です。

ファイルを常に読み取る場合は、まずファイルをスキャンして、ある種のインデックスに行のオフセットを記録し、fseek()fread()を使用して、必要な行を正確に読み取ります。

前述したように、データベースは基本的に独自のデータベースを作成するのではなく、同様の作業を行うことができるため、ファイルを行単位で読み込み、あなたが望む行をクエリで取得します。

2

"行"の用語は単なる慣例なので、特定の行を探す方法はありません。行は "\ nで区切られた文字の集合"です。ファイルにはこの慣例がありません。したがって、N行目を得るためには、必要な行数を数えるためにcharをトラバースする必要があります。

あなたが言及したように、何らかの種類のカスタム作成インデックス(row number - offset in bytesリストなど)を使用してパフォーマンスを向上させることができますが、それを構築するには、とにかくファイルを解析する必要があります。

-1
<?php 

    $strings = file_get_contents($file); 

    $length= strlen($strings); 

    for($i=0;$i<$length;$i++) { 
     print $strings{$i}; 
    } 

?> 

上記のコードは、文字列内のファイルの内容を取得し、その後、あなたがそれらを利用したいか、今のあなた件まで、1ずつ文字1を反復します。

関連する問題