7

PHPでこれを行う方法を誰かが知っているかどうか疑問に思っていました。ファイルを開き、最初の1000行を取得し、それらの行でいくつかのことを行うスクリプトを実行しています。次に、phpファイルはそれ自体の別のインスタンスを開いて次の1000行を取得し、ファイルの最後に到達するまで繰り返します. 特定の行をシークできるように splfileobject を使用しています。これにより、これを 1000 行のチャンクに分割することができます。私が抱えている最大の問題は、パフォーマンスにあります。私は10,000,000行以上のファイルを扱っていますが、最初の10,000行ほどは非常に高速ですが、その時点以降は急激な速度低下があり、その時点まで探す必要があると思います.

私がやりたいのは、最初の 1000 行を読み取り、ファイルからそれらを削除して、スクリプトが常に最初の 1000 行を読み取るようにすることです。ファイルの残りの部分をメモリに読み込まずにこれを行う方法はありますか。私が見た他の解決策には、各行を配列に読み取ってから最初の X エントリを取り除くことが含まれますが、1,000 万行ではメモリと時間がかかりすぎます。

誰かがパフォーマンスを高速化する解決策やその他の提案を持っている場合は、大歓迎です。

4

2 に答える 2

1

残念ながら、ファイルは読み取られる前に常にメインメモリに完全にロードされるため、これに対する実際の解決策はありません。

それでも、これは可能な解決策であるため、この回答を投稿しましたが、パフォーマンスはほとんど向上しないと思います。私が間違っている場合は私を訂正してください。

XMLを使用して、ファイルを1000行の単位に分割できます。また、PHPのDomDocumentクラスを使用して、データを取得および追加します。データを追加し、最初の子を取得して最初の1000行を取得し、必要に応じてノードを削除する場合は、子を追加できます。ちょうどこのような :

<document>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    <part>
        . . . 
        Thousand lines here
        . . . 
    </part>
    .
    .
    .
</document>

別の方法 :

セクションを正確に1000行に分割することに本当に確信がある場合は、各1000が異なる行にあるデータベースに保存してみませんか?これを行うことにより、ファイルの読み取り/書き込みのオーバーヘッドを確実に削減し、パフォーマンスを向上させることができます。

于 2012-03-26T18:55:47.593 に答える
1

目的は膨大な量のデータを解析してデータベースに挿入することだと思いますか? もしそうなら、正確に1000行で作業することが重要な理由を理解できませんか?

1 MB などの大量のデータを一度にメモリに読み込み、メモリ内のチャンクの最後から最後の行末まで逆方向にスキャンするだけでアプローチできると思います。それができたら、ファイルの位置と余分なデータ (最後の行からチャンクの最後までの残り) を保存できます。または、fseek() を使用してファイル ポインターを、最後の行が終わっているファイル内の場所にリセットするだけで、strlen($chunk) で簡単に実行できます。

そうすれば、explode("\r\n", $chunk) を実行してチャンクを分解するだけで、必要なすべての行を、さらに処理するために適切な大きさのブロックにまとめることができます。

ファイルの先頭から行を削除することはお勧めしません。これにより、膨大な量のデータがディスクとの間でシャッフルされます。

于 2012-03-28T20:36:32.390 に答える