0

プレーンテキストファイルからデータを挿入し、各行を2つの部分に分解してから、データベースに挿入する必要があります。私はこのようにやっていますが、このプログラムは速度を最適化できますか?

ファイルには約27000行のエントリ
DB構造があります[一意キー(ext、info)]

  • ext [varchar]
  • info [varchar]

コード:

$string = file_get_contents('list.txt');  
$file_list=explode("\n",$string);  
$entry=0;  

$db = new mysqli('localhost', 'root', '', 'file_type');  
$sql = $db->prepare('INSERT INTO info (ext,info) VALUES(?, ?)');  

$j=count($file_list);  
for($i=0;$i<$j;$i++)  
{  
 $data=explode(' ',$file_list[$i],2);   
 $sql->bind_param('ss', $data[0], $data[1]);  
 $sql->execute();  
 $entry++;  
}   
$sql->close();  
echo $entry.' entry inserted !<hr>';
4

5 に答える 5

2

ファイルにext/infoの一意のペアが含まれていることが確実な場合は、インポート用のキーを無効にしてみてください。

ALTER TABLE `info` DISABLE KEYS;

そしてインポート後:

ALTER TABLE `info` ENABLE KEYS;

このようにして、一意のインデックスは、何かが挿入されるたびにではなく、すべてのレコードに対して1回再構築されます。

速度をさらに上げるには、このファイルの形式をCSV互換に変更し、mysqlLOADDATAを使用てphpのすべての行を解析しないようにする必要があります。

于 2012-04-30T17:41:16.713 に答える
2

挿入する項目が複数ある場合は、通常、すべてのデータをCSVファイルに入れ、CSVに一致する列を持つ一時テーブルを作成し、LOAD DATA [LOCAL] INFILEを実行して、そのデータを宛先テーブルに移動します。しかし、私が見ることができるように、あなたは多くの追加の処理を必要としないので、あなたは追加の問題なしにあなたの入力ファイルをCSVとして扱うことさえできます。

$db->exec('CREATE TEMPORARY TABLE _tmp_info (ext VARCHAR(255), info VARCHAR(255))');
$db->exec("LOAD DATA LOCAL INFILE '{$filename}' INTO TABLE _tmp_info
           FIELDS TERMINATED BY ' '
           LINES TERMINATED BY '\n'"); // $filename = 'list.txt' in your case
$db->exec('INSERT INTO info (ext, info) SELECT t.ext, t.info FROM _tmp_info t');

COUNT(*)その後、一時テーブルを実行して、そこにあったレコードの数を表示できます。

于 2012-04-30T17:44:25.870 に答える
0

読みたい大きなファイルがある場合、私は使用しませんfile_get_contents。これを使用すると、インタプリタにコンテンツ全体を一度にメモリに保存するように強制しますが、これは少し無駄です。

以下は、ここから抜粋したスニペットです。

$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
   $line = fgets($file_handle);
   echo $line;
}
fclose($file_handle);

これは、一度に1つのインスタンスでファイルからメモリに保持しているのは1行(ファイルの内容全体ではない)だけであるという点で異なります。これにより、スクリプトの実行時のメモリフットプリントが低下する可能性があります。 。あなたの場合、同じループを使用してINSERT操作を実行できます。

于 2012-04-30T17:45:55.530 に答える
0

Talendのようなものを使用できる場合。これはETLプログラムであり、シンプルで無料です(有料版があります)。

于 2012-04-30T17:59:28.747 に答える
0

これが魔法の解決策です[3秒対240秒]

ALTER TABLE infoDISABLE KEYS;

$db->autocommit(FALSE);
//insert
$db->commit();

ALTER TABLE infoENABLE KEYS;

于 2012-04-30T18:31:44.493 に答える