4

私は誰かのために何百万もの古いログエントリでデータマイニングを行っています.この問題でPHPを使用して、資料を既存のPHPシステムに簡単にリンクできるようにしたいと思っています.

ターミナル (OSX 10.8) の PHP 5.4.4 でこのコードを実行します。

// Settings
ini_set('error_reporting', E_ALL); // Shows all feedback from the parser for debugging
ini_set('max_execution_time', 0); // Changes the 30 seconds parser exit to infinite
ini_set('memory_limit', '512M'); // Sets the memory that may be used to 512MegaBytes


echo 'Start memory usage: '.(memory_get_usage(TRUE) / 1024)."\n";

$x = Array();
for ($i = 0; $i < 1e7; $i++) {
    $x[$i] = 1 * rand(0, 10);
    //unset($x[$i]);
}

echo 'End memory usage: '.(memory_get_usage(TRUE) / 1024)."\n";
echo 'Peak memory usage: '.(memory_get_peak_usage(TRUE) / 1024)."\n";

これは、1,000 万サイクルの単純なテストです。Pythonで辞書を使用する場合と比較して、漏れは本当に悪いです:(。

使用法をテストするために unset() 関数の引用符を外すと、すぐにすべてがユニコーンとレインボーになります。したがって、メモリの解放を強制するとうまくいくようです。

その 512M メモリ制限内で 1000 万から 5000 万の配列エントリを維持できる方法はありますか?

この種のループで正規表現をいつ実行するか想像できません..

4

2 に答える 2

3

本当にPHP 配列 (および値) の大きSplFixedArrayは? (ヒント:大きい!)

$t = 1e6;
$x = array();
for($i = 0; $i < $t; $i ++) {
    $x[$i] = 1 * rand(0, 10);
}

出力

Start memory usage: 256
End memory usage: 82688
Peak memory usage: 82688

$t = 1e6;
$x = new SplFixedArray($t);
for($i = 0; $i < $t; $i ++) {
    $x[$i] = 1 * rand(0, 10);
}

出力

Start memory usage: 256
End memory usage: 35584
Peak memory usage: 35584

しかし、REDISのようなメモリ ベースのデータベースを検討する必要があると思います。

于 2013-02-14T17:54:28.260 に答える
0

SplFixedArray が機能しない場合は、RabbitMQ の使用を強くお勧めします -> http://www.rabbitmq.com/tutorials/tutorial-one-php.html

RabbitMQ は、通常人々が考えるよりも構成と使用が簡単で、PHP 用の優れたライブラリを備えています。

RabbitMQ を使用すると、スクリプトは (設定したコンシューマーの数に応じて) 10 倍、20 倍、100 倍高速になり、任意の量のデータを管理することもできます。

私は、RabbitMQ を使用して何百万もの行をインポートし、デンマークで登録されたすべての車に関する情報を取得しました。これがどれほど大きいか想​​像してみてください。

于 2014-11-24T14:36:09.200 に答える