0

私はUSDA栄養データをASCIIバージョンのデータからmysqlデータベースにロードしようとしています。ここからスクリプトを使用しましたが、サイズが最大34MBのNUT_DATA.txtファイルを除いてすべてが入っていました。この関数を使用して、phpスクリプトを使用してファイルが正しくロードされます(したがって、メモリ制限は問題になりません。いずれにせよ、128Mに設定されfile_get_contentsます)。ただし、そのpreg_split('#\n#', $file)行に到達すると、スクリプトはそれ以上のコメントなしで終了します。ファイルを細かく分割すると、正常に実行されます。完全なファイルで機能しないのはなぜですか?memory_limitを128Mに設定し、upload_max_filesizeを128Mに設定しています。ファイル全体が読み込まれたpreg_splitようですが、問題があるように見えるのはそれだけです。

私が見逃している明らかなものはありますか?

ありがとう!

これが私がテストしてきたphpコードです:

<?php
// from http://drupal.org/node/107806

//$dbh=mysql_connect(/*db info*/);
//mysql_select_db(/*db info*/);
try
{
  $dbh = new PDO('mysql:host=127.0.0.1;dbname=XXXXXXX', 'XXXXXXX', 'XXXXXXX');
  echo "PDO access worked! <br />";
} catch (PDOException $e)
{
  echo "PDO error: " . $e->getMessage() . "<br />";
  die();
}

//List of SR20 filenames with associated field counts.
$filenames = array(//"DERIV_CD" => 2,
//        "FD_GROUP" => 2,
//        "NUTR_DEF" => 6,
//        "SRC_CD" => 2,
//        "WEIGHT" => 7,
//        "FOOTNOTE" => 5,
//        "DATA_SRC" => 9,
//        "DATSRCLN" => 3,
//        "FOOD_DES" => 14,
        "NUT_DATA" => 17
//        "NUT_DATA2" => 17,
//        "NUT_DATA_test" => 17
     );
foreach($filenames as $filename => $count) {
    echo "inside foreach: $filename ";
    $file = file_get_contents($filename.'.txt');
    echo " read in the file, length = " . strlen($file) . "<br />";
    $lines = preg_split('#\n#', $file);
    echo "made it past preg_split <br />";
//    print_r($lines);
    echo " lines = " . count($lines). "<br />";
    for($i=0;$i<count($lines);++$i) {
        $line = $lines[$i];
//        echo "Inside for loop, line = '" . $line . "'<br />";
        //Some text fields are split over several lines. Concatenate them.
        while(substr_count($line, '^') < $count-1 || (substr_count($line, '~')%2) == 1) {
            ++$i;
            if($i>=count($lines)) { break; }
            $line .= '<br />'.$lines[$i];
        }
        $fields = trim($line);
        if(strlen($fields) == 0) continue;
        $fields = str_replace(array("'", '~', '^'), array("''", "'", ','), $fields);
        $sql = "INSERT INTO `$filename` VALUES($fields);";
        //Insert zeroes for unfilled values.
        $sql = str_replace(array(',,', ',)'), array(',0,', ',0)'), $sql);
        $sql = str_replace(array(',,', ',)'), array(',0,', ',0)'), $sql);
        $sql = str_replace(array(',,', ',)'), array(',0,', ',0)'), $sql);
        //Some single-char fields aren't quoted.
        $sql = preg_replace('#,([A-Z])\);$#', ",'$1');", $sql);
// comment out the database interface until things are working
/*        $stmt = $dbh->prepare($sql);
        if(!$stmt->execute()) 
        {
            echo $sql;
        }
*/
    }
}
echo "done";
?>
4

2 に答える 2

0

PHPの先頭に次の2行を追加しました。

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

そしてそれはそれがメモリを使い果たしたと私に言った。メモリを再度(256Mに)アップすると、問題が解決しました。タスクがどれだけのメモリを使用するかは推測できません。

于 2012-11-15T19:01:56.140 に答える
-1

この構成を httpd.conf に追加します

ThreadStackSize 8388608
于 2015-07-29T17:08:02.600 に答える