2013-02-13 15 views
7

~ 1 GB boyutunda bir sekme ile ayrılmış dosyayı ayrıştırmaya çalışıyorum. Senaryoyu çalıştırmakÇok büyük bir dosyanın içeriğini oku ve ayrıştırın

i olsun:

Fatal error: Allowed memory size of 1895825408 bytes exhausted (tried to allocate 1029206974 bytes) ... 

anda benim komut dosyası sadece geçerli:

$file = file_get_contents('allCountries.txt') ; 

$file = str_replace(array("\r\n", "\t"), array("[NEW*LINE]", "[tAbul*Ator]"), $file) ; 

Sonra -1, php.ini dosyasından hafıza limitini ayarlamış beni verir:

Fatal error: Out of memory (allocated 1029963776) (tried to allocate 1029206974 bytes) 

kısmen dosyayı açın ve daha az bellek kullanılıp böylece bir sonraki aşamasına geçmek için yine de var mı Bir seferde?

+1

Neden dosya satırını işlemeksiniz ?! –

cevap

10

Evet, satır satır okuyabilirsiniz: Eğer o da çöküyor fopen değil Komut dosyasını zaman aşımı ayarı olduğundan emin

$handle = @fopen("/tmp/inputfile.txt", "r"); 
if ($handle) { 
    while (($buffer = fgets($handle, 4096)) !== false) { 
     echo $buffer; 
    } 
    fclose($handle); 
} 
+1

Sekme ile ayrılmış bir dosya için lütfen basitlik için fgetcsv() kullanın –

1

musunuz? Varsayılan değer genellikle 30 saniye civarındadır ve dosyanızın okunması için daha uzun sürüyorsa, bu durum bu kadar uzun olabilir.

Düşünmeniz gereken diğer bir nokta, komut dosyanızdaki bellek sınırlaması olabilir - dosyayı bir dizide okumak bunun üstesinden gelebilir, bu nedenle bellek uyarıları için hata günlüğünü kontrol edin.

Yukarıdakilerden hiçbiri sizin sorununuz değilse, dosyayı çevrimiçi olarak okumak için fgets'u kullanarak işleme koyma işlemini gerçekleştirebilirsiniz.

$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle"); 
if ($handle) { 
    while (!feof($handle)) { 
     $buffer = fgets($handle, 4096); 
     // Process buffer here.. 
    } 
    fclose($handle); 
} 

Düzenleme PHP hata atmak görünmüyor

, sadece false döndürür.

yolu, komut dosyasının çalıştığı yere göre doğru mu? Belki de dosya adı için burada mutlak bir yol belirlemeye çalışın.

+0

Dosyayı belleğe yüklüyorsam yaklaşık 2 saniye içinde gerçekleşir, hata str_replace ile olur, ancak satırı hat öneri olarak deneyeceğim. – imperium2335

+0

hatası str_replace ile gerçekleşir çünkü bu durumda php aynı büyüklükteki belleği başka bir değişkene kopyalamayı dener –

2

Dosyayı okumak için blokları kullanmalısınız. Bu sorunun cevabını kontrol edin. https://stackoverflow.com/a/6564818/1572528

Ayrıca bunu daha az büyük dosyalar için de kullanmayı deneyebilirsiniz.

ini_set('memory_limit', '32M'); //max size 32m 
1

Evet, bunun için ve fread/fgets Fopen kullanın:

http://www.php.net/manual/en/function.fread.php

string fread (resource $handle , int $length) 

Seti $ uzunluğunu okumak istediğiniz dosyanın kaç üzere. $ tutamacı yeni okumaların konumunu kaydeder, daha sonra fseek ile konumu daha sonra ayarlayabilirsiniz ....

İlgili konular