1

データベースからデータをロードする php スクリプトがあります。データをロードしているテーブルのサイズは 50 MB で、現在の PHP メモリ設定では 128 MB が許可されていますが、それでもエラー メッセージが表示されます。

Allowed memory size of 134217728 bytes exhausted (tried to allocate 6 bytes)

いくつかの調査により、php.ini で次のように変更することになりました。

memory_limit = 128M

-1 に変更しました。ドキュメントによると、無限に設定されます。無駄に。

クエリが 50 MB のすべてを返したとしても、制限が 128 MB に設定されているため文句を言うべきではないことは意味がないだけでなく、奇妙なことに、実行するクエリは多くのメモリを必要としません: エコーアウトして実行するとデータベースに直接入力すると、3 行しか返されません。クエリは次のようになります。

SELECT * FROM table WHERE foreign_id=1

その問題を解決する方法を知っている人はいますか?メモリ制限を無限に設定したいと思います。

編集1

まず第一に、ブラウザからではなく、端末からスクリプトを実行することは重要ですか?

次に、php コードは次のとおりです。

//Connect to database
$user="root";
$databasePassword="password";
$host="127.0.0.1";
$database="primarydata";
$identifier=mysql_connect($host,$user,$databasePassword,true);
$db1=mysql_select_db($database);

//Select * from first table
$query="SELECT id,name,city,country FROM table1 WHERE id>=1 ORDER BY id ASC";
$result=mysql_query($query);
$datas=array();
while($row=mysql_fetch_object($result)) $datas[]=(object) $row;

//Loop through artists
for($i=0;$i<sizeof($datas);$i++){
    for($j=$i+1;$j<sizeof($datas);$j++){
        //This is where the problem occurs
        $query="SELECT * FROM table2 WHERE data_id=".$datas[$i]->id;
    }
}

第三に、「--enable-memory-limit」を使用する必要がありますか?

4

2 に答える 2

2
  1. オブジェクトを返すと、より多くのRAMが使用されます
  2. 片方をもう片方の中に書いてみませんか。
  3. mysql_ *メソッドは非推奨になっているため、新しいmysqli_*メソッドを使用する必要があります。
  4. 最初の結果セット全体を配列にロードするのはなぜですか?100MBがあり、MySQLクライアントライブラリはすでに50MBをキャッシュにロードしてから、PHPで再度キャッシュします。

例:

//Select * from first table
$query  = "SELECT id, name, city, country FROM table1 WHERE id >= 1 ORDER BY id ASC";
$result = mysqli_query($dbc, $query);
while($row = mysqli_fetch_array($result)) {
    //Loop through artists
    $query2  = "SELECT * FROM table2 WHERE data_id = " . $row['id'];
    $result2 = mysqli_query($dbc, $query2);
    while($artist = mysqli_fetch_array($result2)) {
        // Do stuff with $row and $artist
    }
}
于 2012-08-05T11:28:39.290 に答える
2

試す:

ini_set('memory_limit','-1')

何百万ものエントリをデータベース (サンプル) に挿入すると、あなたと同じ問題が発生しました。これは役に立ちました。

編集:追加するには、これを使用することはお勧めしません(例として、例としてローカルホストでのみ、データベースに大量のサンプルデータを入力するなど)。この回答は、phpコードを投稿する前に投稿されました...

于 2012-08-05T10:56:42.160 に答える