2011-08-08 5 views
2

10MB의 텍스트 파일이 있습니다.
줄의 길이는 다를 수 있습니다.큰 텍스트 파일에서 한 줄 읽기

이 파일에서 하나의 특정 행을 읽는 가장 효율적인 방법은 무엇입니까? 예 : get_me_the_line($nr, $file_resource)

답변

6

선이 다양한 길이 인 경우 선으로 점프하는 방법을 모르겠습니다. 그러나 아무 것도 사용하지 않을 때는 꽤 빠르게 반복 할 수 있고 관심있는 것을 반환 할 수 있습니다. 이 앞서 라인을 읽기 때문에

function ReadLineNumber($file, $number) 
{ 
    $handle = fopen($file, "r"); 
    $i = 0; 
    while (fgets($handle) && $i < $number - 1) 
     $i++; 
    return fgets($handle); 
} 

편집

나는 루프에 - 1을 추가했다. 따라서 $number은 0 인덱스 라인 참조입니다. 줄 1이 파일의 첫 줄을 의미하면 - 2으로 변경하십시오.

2

줄의 길이가 다양하기 때문에 줄의 끝을 나타낼 수 있으므로 각 문자를 살펴야합니다. 가장 빠른 방법은 파일 시스템의 블록 크기와 같은 크기의 청크로 파일을로드하고 원하는 줄에 올 때까지 줄 바꿈을 계산하는 것입니다. 더 나은 방법은 행을 포함하는 파일에 대한 정보를 저장하는 색인 ​​파일을 만드는 것입니다. 데이터베이스를 사용하는 것도 좋은 아이디어 일 수 있습니다.

1

파일이 실제로 크고 (* GB 이상) 애플리케이션이 * nix 일 경우 이 아닐 수도 있습니다.은 PHP에서 파일 처리를 시도하고 대신이 종류의 라인에 최적화 된 기존 유닉스 도구를 사용하려고합니다. 처리. 이러한 도구가 sed이고 거대한 파일에서 특정 줄을 인쇄하는 예는 here입니다.

system_exec() 호출로이를 감싸거나 비슷한 기능으로 작성해야합니다.

+0

단지 OP가 파일이 단지 10MB라고 언급했음을 보았습니다. 그것을 놓쳤습니다. 이 솔루션은 아마도 수백 MB 미만의 모든 것에 대해 이식성을 달성할만한 가치는 없습니다. –

+0

그래, 그게 최선의 선택이지만, 나는 루트 액세스 권한이 없으므로 'exec'할 수 없으므로 PHP 솔루션이 필요하다. – Sfisioza

관련 문제