2011-10-10 3 views
6

대용량 파일 인 10 만 줄이 있습니다. 나는 각 라인을 읽고 그것을 처리 할 수있다. 또는 라인을 어레이에 저장 한 다음 그것을 처리 할 수있다. 여분의 기능을 위해 배열을 사용하는 것을 선호하지만 배열에 많은 행을 저장하는 것과 관련된 메모리 사용에 대해 정말로 우려하고 있습니다.대용량 파일을 한 줄씩 읽거나 줄을 배열에 저장

+1

이 작업을 한 번만 수행해야합니까, 아니면 동시에 많은 웹 사용자가이 작업을 트리거 할 예정입니까? 그리고 많은 경우, 왜 파일의 내용을 데이터베이스에 저장하지 않습니까? –

+0

'SplFileObject'를 사용하여 텍스트 라인 (iterator)에 대한 배열과 같은 접근을 얻을 수 있습니다. – mario

+0

아마도 문제에 대한 더 나은 접근 방법을 찾지 못했을 것입니다. 드물게 당신은 100 000 라인을 모두 동시에 * 메모리에서 열어야합니다. 이를 수행하는 다른 방법을 생각해보십시오. 기존 계획에 성능 문제가있을 것입니다. – Incognito

답변

3

익숙해 져야 할 두 가지 기능이 있습니다.

첫 번째 파일은 file()입니다.이 파일은 전체 파일을 배열로 읽어 들이고 각 줄은 배열 요소로 읽습니다. 이것은 짧은 파일에 유용하며 아마도 100k 라인 파일에서 사용하고자하는 것이 아닙니다. 이 함수는 자체 파일 관리를 처리하므로 파일을 명시 적으로 열고 닫을 필요가 없습니다.

두 번째 파일은 한 번에 한 줄씩 파일을 읽는 데 사용할 수있는 fgets()입니다. 처리 할 줄이 더있는 한이 줄을 반복하여 루프 내에서 줄 처리를 실행할 수 있습니다. 이 파일에 대한 핸들을 얻으려면 fopen()을 사용해야합니다. 복구 관리를 위해 파일 포인터를 직접 추적해야 할 수 있습니다 (즉, 무언가가 옆으로 가고 스크립트가 실패하면 다시 처리하지 않아도됩니다.)

시작하면 충분합니다.

1

둘의 조합은 어떻습니까? 배열에 1000 줄을 읽고 처리하고 배열을 삭제 한 다음 1000 개를 읽습니다. 메모리 사용을 모니터링하고 한 번에 배열에 읽는 횟수를 조정합니다.

관련 문제