2013-02-13 2 views
7

~ 1GB 크기의 탭으로 구분 된 파일을 구문 분석하려고합니다. 내가 스크립트를 실행매우 큰 파일의 내용을 읽고 구문 분석합니다.

내가 얻을 :

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

순간에 내 스크립트가 그냥 :

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

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

나는 -1로는 php.ini의 메모리 제한을 설정 한 나 제공 :

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

부분적으로 파일을 열고 적은 메모리가 사용되도록 다음 부분에 이동에 어쨌든 거기 한 때?

+1

파일을 한 줄씩 처리하지 않는 이유는 무엇입니까? –

답변

10

예, 라인으로 라인을 읽을 수 있습니다 : 당신은 실패한 것 fopen하지 스크립트의 제한 시간 설정의 확인

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

탭으로 구분 된 파일의 경우 단순화를 위해 fgetcsv()를 사용하십시오. –

1

있습니까? 기본값은 대개 약 30 초 정도이며, 파일을 읽는 시간보다 오래 걸리면 파일이 너무 빨리 걸릴 수 있습니다.

고려해야 할 또 다른 사항은 스크립트의 메모리 제한 일 수 있습니다. 배열로 파일을 읽는 것이이 문제를 해결할 수 있으므로 오류 로그에서 메모리 경고를 확인하십시오.

위의 어느 쪽도 문제가 아니라면 fgets을 사용하여 줄 단위로 파일을 읽으면서 처리 할 수 ​​있습니다.

$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); 
} 

편집 PHP는 오류가 발생하지 않는 것

, 그냥 false를 반환합니다.

$rawfile의 경로는 스크립트가 실행되는 위치와 관련하여 올바른지? 파일 이름에 절대 경로를 설정하십시오.

+0

파일을 메모리에로드하는 경우 약 2 초 만에 오류가 str_replace와 함께 발생하지만 줄별로 제안을 시도합니다. – imperium2335

+0

이 경우에는 PHP가 다른 변수에 같은 크기의 메모리를 복사하려고하기 때문에 str_replace에서 오류가 발생합니다. –

2

파일을 읽으려면 블록을 사용해야합니다. 이 질문의 답을 확인하십시오. https://stackoverflow.com/a/6564818/1572528

크기가 작은 파일에도 사용할 수 있습니다.

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

예,이과 FREAD /는 fgets fopen을 사용

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

string fread (resource $handle , int $length) 

설정 $ 길이를 읽으려는 파일의 얼마나 많은에. $ handle은 새 읽기 위치를 저장합니다. fseek를 사용하면 나중에 위치를 설정할 수도 있습니다 ....

관련 문제