2008-11-05 4 views
2

나는 CSV 파일을 10 ~ 20 메가의 라인 단위로 읽어야한다. file()은 쓸모가 없다 ;-) 그리고 나는 가장 빠른 방법을 찾아야한다.PHP에서 larges 파일을 읽는 가장 좋은 방법은 무엇입니까?

필자는 fgets()를 사용해 보았지만, 호출 할 때마다 작은 블록을 읽는 지, 아니면 더 큰 파일을 캐시하고 I/O를 최적화하는지 모릅니다. EOL을 직접 구문 분석하여 fread() 방식으로 시도해야합니까?

감사 세드릭

답변

7

가능하면 fgetcsv()을 사용해야합니다.

그렇지 않으면 항상 fgets()가 있습니다.

1

fgets()는 사용자의 요구에 완벽하게 잘해야합니다. file()도 괜찮을 것입니다. 20mb는 많은 시간을 동시에하지 않는 한 그렇게 크지 않습니다.

fgets()의 두 번째 매개 변수를 조정할 수 있음을 잊지 마세요.

+0

기본 PHP 설정은 프로세스 당 최대 8MB의 메모리 사용을 허용합니다. 이 경우 20Mb가 큽니다. (나는 당신이 그것을 바꿀 수 있다는 것을 알고 있지만, 왜 당신이 원하지 않는지에 대한 분명한 이유가 있음). –

+0

Jasper Bekkers가 맞고 file()이 내 필요에 너무 많은 메모리를 사용합니다. –

0

당신은 fgetcsv()을 봐야합니다. 자동으로 분리 된 줄을 배열로 구문 분석합니다.

런타임 효율성에 대해서는 잘 모르겠다. 나중에 처리 할 것으로 예상되는 크기의 파일로 빠른 테스트를 실행해야합니다. 하지만 fget면 놀라실 것입니다. ??? 및 fput ??? 기능이 I/O 최적화되지 않았습니다.

2

stream_get_line은 대용량 파일의 경우 fgets보다 더 효율적입니다. 읽기에 현명한 최대 길이를 지정하면 PHP가 줄을 읽는 데 '앞서 읽어야'하는 이유가 없습니다. 걱정할 것 같습니다.

CSV를 사용하려면 fgetcsv가 결과를 약간 더 현명한 형식으로 반환합니다.

관련 문제