Başvuru Kodu Redesign hiçbir azaltmak için.

3 Cevap php

Scenario

Ben csv dosyası verilerinin yaklaşık 100K satır var, veritabanına bir büyük CSV dosyası ve ekleri verilerini ayrıştırmak istiyorum.

Şu anda fgetcsv yani şu anda veritabanı isabet sayısı 100K olan satır dosyası satır ayrıştırmak ve veritabanına veri eklemek ve böylece şu anda ben csv dosyası mevcut verilerin her bir hat için bir veritabanı isabet am kullanıyorum hangi değil bakış performans açısından iyi.

Current Code:

public function initiateInserts()
{
    //Open Large CSV File(min 100K rows) for parsing.
    $this->fin = fopen($file,'r') or die('Cannot open file');

    //Parsing Large CSV file to get data and initiate insertion into schema.
    while (($data=fgetcsv($this->fin,5000,";"))!==FALSE)
    {
        $query = "INSERT INTO dt_table (id, code, connectid, connectcode) 
                 VALUES (:id, :code, :connectid, :connectcode)";

        $stmt = $this->prepare($query);
        // Then, for each line : bind the parameters
        $stmt->bindValue(':id', $data[0], PDO::PARAM_INT);
        $stmt->bindValue(':code', $data[1], PDO::PARAM_INT);
        $stmt->bindValue(':connectid', $data[2], PDO::PARAM_INT);
        $stmt->bindValue(':connectcode', $data[3], PDO::PARAM_INT);

        // Execute the statement
        $stmt->execute();
        $this->checkForErrors($stmt);
    }
}

Ben yerine veri her satır için Veritabanı isabet, ben sorguyu hazırlamak ve bir kez daha vurdu ve ekler ile Veritabanı doldurmak neyin bir yol arıyorum.

Herhangi Öneriler!

Note: Bu ben kullanıyorum ama CSV dosyası artık var tam örnek kod. alan ve kimliği, kod, connectid ve connectcode değil sadece ama emin ben mantığını açıklamak mümkün ve işte bu örnek kod kullanmış yapmak istedim.

Teşekkürler!

3 Cevap

Sizin ise döngü sorgu dizesi oluşturmak sadece, ve döngü dışına deyim yürütmek. Yani böyle bir şey işe (beri sözdizimi hakkında emin değil onun i php yazdım ama çalışması gerekir uzun bir zaman oldu olmalıdır:

public function initiateInserts()
{
    //Open Large CSV File(min 100K rows) for parsing.
    $this->fin = fopen($file,'r') or die('Cannot open file');

    //Parsing Large CSV file to get data and initiate insertion into schema.
    $query = "";
    while (($data=fgetcsv($this->fin,5000,";"))!==FALSE)
    {
        $query = $query . "INSERT INTO dt_table (id, code, connectid, connectcode) 
                 VALUES (" . $data[0] . ", " . $data[1] . ", " . $data[2] . ", " . $data[3] . ")";
    }
     $stmt = $this->prepare($query);
     // Execute the statement
     $stmt->execute();
     $this->checkForErrors($stmt);
}

I PHP dont beri çözüm sunamıyoruz.

Ama bir dizide bu dizeleri depolamak ve 100 ya da öylesine yığınları içinde BD veri gönderebilirsiniz.

AssembledInsert ekler dizi ToString olan conn.Execute (assembledInsert) gibi bir şey.

Tüm süreç açık bir bağlantı tutmak ve yalnızca bu birini kullanın.

Hazırlanan tablolar birden fazla kez çalıştırmak içindir: - Sorgu bina güvenliği yanında - ", bir zamanlar hazırlamak pek yürütmek" I hazırlanan tabloların noktası düşünüyorum.

Yani denemek ve döngünün hazırlamak ifadesini almak ve sadece parametre bağlama ve içinde yürütme tutabilirsiniz.