2014-12-31 7 views
0

매우 큰 파일 하나만 있습니다. 약 260 만 개의 숫자가 들어 있습니다. 파일은 약 15MB입니다.문자열에서 n 번째 숫자 얻기

제 목표는이 한 줄짜리 문자열에서 n 번째 숫자를 찾는 것입니다.

파일을 문자열로 읽으려고했습니다 (단 한 줄의 파일임을 기억하십시오). 그런 다음 나는 문자열을 폭발시켜 메모리가 부족한 배열로 만들었습니다. (소진 268,435,456 바이트의 허용 메모리 크기 (

내가 바로 그 일을하고 있는가) 71 바이트를 할당하려고? 아니면이 매우 큰 문자열의 n 번째 값을 찾을 수있는 또 다른 쉬운 방법인가?

$file = file_get_contents ('a.txt', true); 
$array = explode(" ", $file, -1); 
echo $array[$nth]; 
+1

'php'에 있나요? – corsiKa

+0

예. PHP에서 죄송합니다. – Frank

+0

파일에 대해 더 알고 싶습니다. 당신이 260 만 개의 숫자를 말할 때, 당신은 분명히 약 260 만 개의 * 숫자를 말하는 것이 아니며, 파일은 15 MB가 아닌 2.6 MB가 될 것입니다. 그래서 우리가 실제로 함께 일하는 것에 대한 예를 보여주십시오. – meagar

답변

0

만들기 카운터 변수 : fopen을 사용하여 파일을 읽고 잠시 후 feoffgets (원하는 버퍼 크기 포함)으로 반복하고, 루프 내에서 방금 읽은 비트에 몇 개의 공백이 있는지 확인합니다 (항목을 추측하고 있음). 공백으로 구분됩니다. 쉼표 또는 기타 항목 일 수 있습니다.) 마지막으로 카운터를 증가시키고 원하는 부분에 도달 할 때까지 계속 진행하십시오 (n 칸 찾고있는 항목이 [n+1]th입니다.)

몇 가지 테스트 된 (16MB 파일 포함) proof-of-concept 코드가 포함되어 있습니다. 더 좋은 방법이 있는지 나는 모른다. 이것이 내 마음에 온 유일한 작품입니다. memory_get_usage은 ~ 8kb의 메모리 사용을보고합니다.

<?php 

$counter; 
$nth = 49959; 
$handle = @fopen('numbers.txt', 'r'); // File containing numbers from 1 to 2130829, size ~16 MB. 

if ($handle) { 
    while (($buffer = fgets($handle, 128)) !== false) { 
     $spaces = substr_count($buffer, ' '); 

     if ($counter + $spaces > $nth) { 
      $numbers = explode(' ', $buffer); 
      $key = $nth - $counter; 
      echo $numbers[$key]; // print '49959' 
      exit; 
     } 
     else { 
      $counter += $spaces; 
     } 
    } 

    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 

    fclose($handle); 
} 

?> 
+0

감사합니다. 위에 표시된대로 숫자는 모두 0, 122, -233 등 다른 크기입니다. 공백으로 구분됩니다. fgets를 사용하여 한 번에 하나의 숫자 (숫자가 아님)를 읽으려면 어떻게해야합니까? – Frank

+0

그럴 수는 없지만 전화 번호를 찾을 때까지 그냥 반복하고 있기 때문에 중요하지 않습니다. 필자는 개념 증명 (proof-of-concept) 코드를 작성하고 테스트했다. 대답에 포함 시켰습니다. – entropid

+0

감사합니다, Entropid. 나는 이것이 효과가 있다고 생각한다! 그러나 나는이 숫자를 ID가있는 mysql 테이블에 두 개 열만 넣는 지 궁금합니다. 그래서 나는 무언가를 볼 필요가있을 때마다 신원 확인을 할 수 있습니다. 매번 fgets보다 빠를 것입니까? – Frank