4

作業中のアプリケーションに少し問題があります。アプリケーションは開発者ツールとして使用され、MySQL サーバーのデータベースから、開発者が Unix curl コマンドを使用して取得する JSON ファイルにテーブルをダンプします。これまで使用してきたデータベースは比較的小さなテーブル (2 GB 以下) ですが、最近、完全に入力されたテーブル (40 GB 以上) を使用するテストの別の段階に移行し、単純な PHP スクリプトが壊れました。これが私のスクリプトです:

[<?php 

$database = $_GET['db'];

ini_set('display_errors', 'On');
error_reporting(E_ALL);

# Connect
mysql_connect('localhost', 'root', 'root') or die('Could not connect: ' . mysql_error());

# Choose a database
mysql_select_db('user_recording') or die('Could not select database');

# Perform database query
$query = "SELECT * from `".$database."`";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());

while ($row = mysql_fetch_object($result)) {
   echo json_encode($row);
   echo ",";
}

?>] 

あなたへの私の質問は、このスクリプトをより大きなデータベース ダンプの処理に関して改善するにはどうすればよいかということです。

4

3 に答える 3

3

これが私が問題だと思うことです:

を使用してmysql_queryいます。mysql_query はデータをメモリにバッファリングし、mysql_fetch_object はそのデータをメモリからフェッチします。非常に大きなテーブルの場合、十分なメモリがありません (ほとんどの場合、1 回の呼び出しで 40G の行すべてを取得しています)。

mysql_unbuffered_query代わりに使用してください。詳細については、MySQL パフォーマンス ブログをご覧ください。この動作の原因として他に考えられることがいくつかあります。

于 2012-10-19T15:21:21.600 に答える
1

PHPではなく、mysqlに任せてください:

SELECT 
 CONCAT("[",
      GROUP_CONCAT(
           CONCAT("{field_a:'",field_a,"'"),
           CONCAT(",field_b:'",field_b),"'}")
      )
 ,"]") 
AS json FROM table;

次のようなものが生成されるはずです。

[
    {field_a:'aaa',field_b:'bbb'},
    {field_a:'AAA',field_b:'BBB'}
]
于 2012-10-19T16:26:58.653 に答える
0

MySQL のバッファリングに問題がある可能性があります。しかし、他の問題もあるかもしれません。スクリプトがタイムアウトする場合は、set_time_limit(0) でタイムアウトを無効にしてみてください。これは簡単な修正方法です。うまくいかない場合は、次の方法も試してみてください。

  1. データベースをオフラインでダンプしてから、スクリプトを介して転送するか、http に直接転送してください。最初の PHP スクリプトで、データベースをテキストにダンプする PHP-CLI スクリプトを呼び出すシェル スクリプトを呼び出してみてください。次に、HTTP 経由でデータベースをプルするだけです。
  2. スクリプトでデータベースの一部 (行 0 から N、N+1 から 2N など) をダンプしてみてください。
  3. http 接続で圧縮を使用していますか? 遅延が転送時間 (スクリプトの処理時間ではない) である場合は、圧縮による転送の高速化が役立つ場合があります。それがデータ転送である場合、JSON はデータを転送する最良の方法ではない可能性があります。多分そうです。知らない。この質問はあなたを助けるかもしれません: PHP配列を保存するための推奨方法(json_encode vs serialize)

また、オプション 1 と 3 については、次の質問を見てみてください。

これを処理する最善の方法は何ですか: PHP による大規模なダウンロード + クライアントからの接続が遅い = ファイルが完全にダウンロードされる前にスクリプトがタイムアウトする

于 2012-10-19T15:53:44.330 に答える