2010-05-24 3 views
1

이것이 가능한지 확신 할 수는 없지만 해결책을 찾기 위해 노력 중입니다.하지만 근본적으로 필자는 배열에 저장할 줄이 매우 큰 파일이 있습니다. 따라서 file()을 사용하고 있지만 일괄 적으로 수행하는 방법이 있습니까? 그래서 모든 것이 100 줄짜리로 만들어지면서 "일시 중지"됩니까?file()을 점진적으로 사용 하시겠습니까?

내가 foreach는 루프 또는 뭔가 할 수있는 일이 될 가능성이 있다고 생각,하지만 난 그것에 대해 올바른 방법을 생각하고 있어요 모르겠어요 ...

$i=0; 
$j=0; 
$throttle=100; 

foreach($files as $k => $v) { 
    if($i < $j+$throttle && $i > $j) { 
    $lines[] = file($v); 
    //Do some other stuff, like importing into a db 
    } 
    $i++; 
    $j++; 
} 
처럼

그러나 나는 $ & $ j가 항상 같을 것이기 때문에 그것이 실제로 작동하지 않을 것이라고 생각합니다. 어쨌든, 느낌이 혼란 스럽습니다. 누군가가 나를 'lil'명확하게 생각하도록 도울 수 있습니까?

+0

을 한 번에? – wallyk

+0

글쎄, 나는 여전히 같은 문제에 직면 해있다, 그렇지? 즉, 다른 처리를 수행하기에 충분히 길게 file()을 "일시 중지"하려고합니까? 여전히 전체 파일을 배열로 읽으려고합니다. – Q7898339

답변

0

당신은 $ 난을 증가 결코 또는 $ j를 ... 당신이 할 수있는 일, 같은 것입니다 :

$data = array(); 
    $chunk = 100; 
    $f = fopen($file, 'r'); 
    while (!feof($f)) { 
     for ($i = 0; $i < $chunk; $i++) { 
      $tmp = fgets($f); 
      if ($tmp !== false) { 
       $data[] = $tmp; 
      } else { 
       //No more data, break out of the inner loop 
       break; 
      } 
     } 
     //Process your data 


     $data = array(); 
    } 
    fclose($f); 
+0

그래, 나는 그것을보고 그것을 편집했지만 너무 빨리 잡았을 것 같아 ... 고마워! – Q7898339

2

는 각 라인을 추가, 당신이 필요하지만 많은 라인을위한 라인으로 라인에서 파일을 읽기 정렬. 배열이 원하는 길이가되면 처리하고 배열을 비 웁니다. 예 :

$handle = @fopen("/tmp/inputfile.txt", "r"); 
$throttle = 100; 
$data = array(); 
if ($handle) { 
    while(!feof($handle)) { 
     $buffer = fgets($handle, 4096); 
     $data[] = $buffer; 
     if(count($data) == $throttle) { 
      doSomething($data); 
      $data = array(); 
     } 
    } 
    fclose($handle); 
} 
0

"일시 중지"로, 당신은 당신이 정말로 스크립트를 사용 수면의 실행 또는 그 변종의 일부 일시 정지 할 것을 의미하는 경우는 파일을 라인을 처리하는 감각을 만들 것 http://php.net/manual/en/function.sleep.php

관련 문제