2016-10-28 6 views
-2

J'ai un fichier CSV avec 1 000 000 lignes et j'ai besoin d'importer ces lignes dans la table PostgreSQL DB, j'ai besoin de le faire très rapidement comme il le peut.Importer rapidement le fichier CSV à postgre

J'ai essayé d'utiliser des générateurs et fsync = off, mais de toute façon j'ai eu le même résultat

maintenant importer le temps est de 17 secondes, comment je peux optimiser le code ou db pour réduire le temps?

Mon code:

<?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

Et quel est le problème? – Epodax

+0

Maintenant le temps d'importation est de 17 secondes, comment puis-je optimiser le code ou DB pour réduire le temps? –

+0

1 000 000 lignes en 17 secondes. Est-ce vraiment mauvais? – jarlh

Répondre

1

supprimer tous les index et les contraintes avant la COPY et les recréer par la suite.

À part cela, seul un matériel plus rapide peut vous aider.

Ne jamais définir fsync=off en production. Ne fais pas ça.