0

大きなデータを mysql にインポートする PHP スクリプトを実行しているときに、次のエラーが発生しました。

memory exhausted near ''$GPGGA','130735.000','60.15751','N','24.74303','E','1','05','1.6','8.7','M','35' at line 1

私は今まで、PHP INI ファイルで 256M のメモリ制限を割り当てていました。このメモリは、これまでのところ私の sript には十分であり、今まで問題は発生していません。メモリ制限を 256MB に保ちながら、サイズが 1MB と 2.84MB のファイルをインポートしました。このエラーは、約 1MB のテキスト ファイルを実行したときに発生しました。

エラーが参照しているメモリはPHPのメモリ制限であると想定しています。他に設定するメモリ制限はありますか? この問題を解決するためのいくつかの提案をいただければ幸いです。どうもありがとう。

新しい編集

...
...
if (is_array($inFile)) {

foreach($inFile as $inFileName) {

    $newFilePath = $upload_directory."/".$inFileName;

    if($inFileName != "")

    $handle = fopen($newFilePath,"r");
    $numlines =1;

    $query = "INSERT INTO gga_raw_data(device_id, gga_date,  nmea, gga_time, latitude, north, longitude, east, fixed_quality, no_of_satelites, hdop, altitude, meters, height_of_geoid, metres, check_sum, test_case_id) values";
    while (($data = fgetcsv($handle)) !== FALSE)
    {
        $numlines++;

        $myDay=substr($data[1], 0,2);
        $myMonth=substr($data[1], 2,2);
        $myYear=substr($data[1], 4,2);

        $gga_date = convertToNiceDate($myDay, $myMonth, 2000+$myYear);

        $longitude = convertToDegrees($data[6]);
        $latitude  = convertToDegrees($data[4]);


        if (!isset($data[16])) {
            $data[16] = '';
        }

        $query .="('$data[0]','$gga_date','$data[2]','$data[3]','$latitude','$data[5]','$longitude','$data[7]','$data[8]','$data[9]','$data[10]','$data[11]','$data[12]','$data[13]','$data[14]', '$data[15]', '$data[16])',";


    }

    $query = substr($query, 0,-1);

まだこの問題に取り組んでいるため、新しい質問を開始したくありません。「メモリ不足」の問題は解決しましたが、今では mySQL クエリ エラーが発生して生活が非常に悲惨なものになり、助けが必要です。

これは、テキスト ファイルからの入力データのサンプルです。

1,070610,$GPGGA,080323.460,6013.45368,N,02445.28396,E,1,04,4.6,18.3,M,35.0,M,,*67
1,070610,$GPGGA,080327.000,6013.44424,N,02445.31214,E,1,05,1.9,30.8,M,35.0,M,,*66

これは echo $query の結果です:

INSERT INTO gga_raw_data(device_id, gga_date, nmea, gga_time, latitude, north, longitude, east, fixed_quality, no_of_satelites, hdop, altitude, meters, height_of_geoid, metres,check_sum) values('1','2010,06,07','$GPGGA','080323.460','60.22423','N','24.75473','E','1','04','4.6','18.3','M','35.0','M','')('1','2010,06,07','$GPGGA','080327.000','60.22407','N','24.7552','E','1','05','1.9','30.8','M','35.0','M','')
)('1','2010,06,07','$GPGGA','053416.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','053431.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','062929.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','080250.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','080305.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','080305.000','0','','0','','0','','','','','','','')('1','2010,06,07','$GPGGA','080320.000','0','','0','','0','','','','','','','')


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('1','2010,06,07','$GPGGA','080327.000','60.22407','N','24.7552','E','1','05','1' at line 1

入力データの最後の変数「*67」がクエリによって解析されていないことに気付きました。*で始まるので認識されていないかどうかはわかりません。

4

2 に答える 2

2

一度に1行ずつ挿入するか、一度に50行にバッチ処理します。

$gen_query=$query; // keep $query as the stub

while (($data = fgetcsv($handle)) !== FALSE)
{
    $numlines++;

    ...
    $gen_query .="('$data[0]','$gga_date','$data[2]','$data[3]','$latitude','$data[5]','$longitude','$data[7]','$data[8]','$data[9]','$data[10]','$data[11]','$data[12]','$data[13]','$data[14]', '$data[15]', '$data[16])',";
   if ($numlines % 50 == 0) {
      mysql_query(substr($gen_query,0,-1));
      $gen_query=$query;
   }
}
if ($gen_query!=$query) mysql_query(substr($gen_query,0,-1));
于 2010-11-11T13:40:36.930 に答える
0

最大投稿サイズ、最大アップロード サイズなど、php.ini で設定できる制限は他にもありますが、そのエラーは別の原因のようです。アップロードされたファイルを読んだ後、本当に大きなオブジェクト [PHP で、おそらく配列] を構築していますか? 昨夜同様の問題が発生し、php.ini のメモリ制限を増やすだけで済みました。

以前にこの問題が発生し、メモリ制限を増やすオプションがなかったため、コードを書き直して、非常に多くのオブジェクトが同時にメモリに格納されないようにする必要がありました。コードを投稿できますか?

于 2010-11-11T12:31:43.123 に答える