• 28-12-2009, 18:40:33
    #1
    Merhaba arkadaşlar;

    elimde yüklü boyutta excel dökümanı var, bunu php ile sql'e insert etmek istiyorum.
    insert konusunda problem yok yalnız veri çok olduğu için tek seferde insert edemiyorum.
    İşin özü php de bana öyle bi döngü lazım ki her 1000 kayıtta bir 10 saniye beklesin sonra döngü kaldığı yerden devam etsin. yani her 10 saniyede bir döngü çalışacak ve insert edicek kayıtları.
    Umarım derdimi anlatabilmişimdir.
    Yardımlarınızı bekliyorum.
  • 28-12-2009, 18:49:55
    #2
    Sleep komutu ile istediğin süre bekleyip sonra devam etmesini sağlayabilirsin.

    ÖRNEK :

    for($i=1; $i<$toplam;$i++)
    {
    .
    .
    .
    if($i % 1000 == 0)
    {
    sleep(10);
    }
    }
  • 28-12-2009, 19:06:44
    #3
    eyvallah üstadım istediğim bu da ram' den patlıyorum yine.

    160bin veri var yani 160.000 döngü her 500 döngüde bir 10 saniye bekletiyorum ama ram konusundan kod hata veriyor. başka bi çözüm önerin varmı

    Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 35 bytes)
  • 28-12-2009, 20:42:36
    #4
    cron job çalıştırarak halledebilir.

    Dosya her çalıştığında 1000 kayıt ekletmek istiyorsun diyelim. Dosya çalışıp 1000 kayıt girdikten sonra bunu bir txt dosyasına yazarsın. Ve her defasında kaldığı sayıyı txt dosyasından okuyup sorguna limit olarak eklersin.

    ÖRNEK :
    Dosya 1. kez çalıştırılıyor.
    -------------------------
    sayi.txt = 0
    limit 0,1000

    Dosya 2. kez çalıştırılıyor.
    -------------------------
    sayi.txt = 1000
    limit 1000,1000

    Dosya 3. kez çalıştırılıyor.
    -------------------------
    sayi.txt = 2000
    limit 2000,1000

    .
    .
    .

    Cronjob ile bu dosyayı belli bir sürede çalıştırırsın.
  • 29-12-2009, 14:56:31
    #5
    aslında ilk yöntemde pek sıkıntı yok.
    excel deki verinin 1000satırını aldım yani veri.xls 1000 satır bulunuyor. 1000 adet satırı. 100'er 100 er sql e insert edebildim. 5 er saniye arayla. 1000 satır sıkıntısız yüklendi. ama satır sayısı 160.000 olunca aşırı ram kullanımından işlem iptal oluyor.

    son söylediğin yöntemde de aynı sıkıntı olucaktır. sanırım çözüm excel dosyasındaki verileri 2000'er şekilde bölmem gerekicek bu biraz amele işi oldu ama başka çözüm gözükmüyor.
  • 29-12-2009, 15:01:23
    #6
    SahinHosting adlı üyeden alıntı: mesajı görüntüle
    aslında ilk yöntemde pek sıkıntı yok.
    excel deki verinin 1000satırını aldım yani veri.xls 1000 satır bulunuyor. 1000 adet satırı. 100'er 100 er sql e insert edebildim. 5 er saniye arayla. 1000 satır sıkıntısız yüklendi. ama satır sayısı 160.000 olunca aşırı ram kullanımından işlem iptal oluyor.

    son söylediğin yöntemde de aynı sıkıntı olucaktır. sanırım çözüm excel dosyasındaki verileri 2000'er şekilde bölmem gerekicek bu biraz amele işi oldu ama başka çözüm gözükmüyor.
    Son yazdığım mesajda sıkıntı yaşamazsın. Örnek 10 dakikada 1 dosyayı çalıştırırsın ve her seferinde 1000 kayıt girersin. Dolayısıyla ram'e 1 kerede yüklenmediğimiz için sorun olmaz.
  • 29-12-2009, 15:06:40
    #7
    bence arkadaş haklı aradaki bekleme süresi arttığı zaman makina kendini toparlamış olur.

    bir örnek vermek gerekirse 100 cuval unu bir saat yerine 3 saatte taşımak gibi dinlene dinlene yani
  • 29-12-2009, 15:09:40
    #8
    ben yeni söylediğin yöntemi pek anlamış değilim en iyisi sana yaptığım işlemleri yazıyım.

    <?php
    require_once 'Excel/reader.php';
    $data = new Spreadsheet_Excel_Reader();
    $data->read('veriler.xls');
    
    for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
    $veri = $data->sheets[0]['cells'][$i][2];
     
    $sorgu = mysql_query("INSERT INTO tablo_adi ( veri) VALUES ('$veri')"); 
    
    
    if($i % 10 == 0)
    {
    sleep(10);
    } 
    
    } 
    
    ?>
    şimdi yapmam gerekeni biraz daha açık yazarsan çok memnun olurum.
  • 29-12-2009, 15:12:10
    #9
    EuDownload adlı üyeden alıntı: mesajı görüntüle
    bence arkadaş haklı aradaki bekleme süresi arttığı zaman makina kendini toparlamış olur.

    bir örnek vermek gerekirse 100 cuval unu bir saat yerine 3 saatte taşımak gibi dinlene dinlene yani
    üstad süreyi nekadar uzatırsam uzatıyım sıkıntı çıkıyor 160.000 satır buda 160.000 döngü ve insert demek 160.000'i görünce makina direk hata veriyor. hiçbir veri kayıt etmiyor. ama bu sayı 1000 olunca sıkıntı yok.