2016-10-28 5 views
-2

私は1 000 000行のファイルCSVを持っており、この行をテーブルPostgreSQL DBにインポートする必要があります。できるだけ早く行う必要があります。ポストグレイへの高速インポートCSVファイル

私は発電機を使用しようとはfsync =オフ、とにかく、私は時間を短縮するために、コードまたはDBを最適化する方法、

今すぐ時間が17秒でインポート同じ結果を持っていましたか?

マイコード:

<?php 
    $time_start = microtime(true); 
    ini_set('max_execution_time', 300); 

    require_once 'db-config.php'; 
    function generateString($length = 15) 
    { 
     $chars = 'qwertyuioplkjhgfdsazxcvbnm'; 
     $numChars = strlen($chars); 
     $string = ''; 
     for ($i = 0; $i < $length; $i++) 
     { 
     $string .= substr($chars, rand(1, $numChars) - 1, 1); 
    } 
     return $string; 
    } 



    $fileName = fopen("users.csv", 'a'); 


    for ($i=0; $i < 1000000 ; $i++) 
    { 
     $firstName = generateString(15); 
     $lastName = generateString(15); 
     $age = rand(10, 90); 
     fputcsv($fileName, [$firstName, $lastName, (string)$age]); 
    } 

    fclose($fileName); 

    $sql = "COPY users FROM '/home/artur/Documents/Projects/test.com/users.csv' CSV;"; 
    $stmt = $pdo->prepare($sql); 
    $stmt->execute(); 

    $time_end = microtime(true); 
    $time = $time_end - $time_start; 

    echo "Done! ({$time} seconds)"; 
+1

問題は何ですか? – Epodax

+0

インポート時間は17秒です。時間を短縮するためにコードやデータベースを最適化する方法はありますか? –

+0

17,000秒で1 000 000行。それは本当に悪いですか? – jarlh

答えて

1

COPY前に、すべてのインデックスと制約を削除し、その後それらを再作成します。

それ以外は、高速なハードウェアでしか手助けできません。

生産中にfsync=offを設定しないでください。ただしないでください。

関連する問題