参考: 有一个1G大小的一个文件,内存限制大小是10M,有序返回频数最高的50个词,该怎么做?
网上有很多该问题的解决方案,都是用分而治之的思想,提到了遍历整个文件。
那么我的问题是:如果单纯地逐行读取大文件,算是把1G文件全都加载进内存吗?或者说是读取大于内存的文件应该怎么读?
认证0级讲师
여기서 메모리는 파이프와 같습니다. 한 줄씩 읽는 것은 1G 파일을 메모리에 전달하는 것입니다. 10M은 파이프의 두께를 나타냅니다. 따라서 한 줄씩 읽으려면 1G 파일加载进去过 메모리가 필요합니다.
加载进去过
으아아아
아무리 파일이 크더라도 각 줄의 길이가 제한되어 있는 한 전체 파일을 읽는 데는 많은 시간이 걸리지만 메모리를 많이 차지하지는 않습니다.
청크로 읽고 청크마다 하나의 결과 세트를 읽고 최종적으로 결과 세트를 집계합니다텍스트를 처리할 때 줄 수를 아는 것이 더 좋습니다
linux위의 split라는 명령이 있는데, 큰 텍스트를 작은 파일로 빠르게 동시에 분할할 수 있는데, 이 알고리즘을 외부 정렬이라고 합니다
linux
split
기억은 글을 다 쓰고 나면 넘기는 종이와 같습니다. 사용된 데이터와 사용되지 않은 데이터는 폐기됩니다.
간단한 예로 변수 버프를 만들고 크기를 설정한 후 파일 스트림을 열고 채워넣습니다. 채워 넣은 후 원하는 내용을 확인하면 다른 변수에 계산됩니다. 그런 다음 버프를 지우고 이전에 읽은 위치에서 다시 콘텐츠를 계속 로드합니다... 읽기가 완료될 때까지 통계가 완료됩니다.
다른 시스템의 경우 메모리보다 큰 파일을 작동할 수 있는 API가 제공됩니다. 즉, 파일이 메모리로 처리됩니다.
内存映射
mmap
파일 매핑 생성
여기서 메모리는 파이프와 같습니다. 한 줄씩 읽는 것은 1G 파일을 메모리에 전달하는 것입니다. 10M은 파이프의 두께를 나타냅니다.
따라서 한 줄씩 읽으려면 1G 파일
加载进去过
메모리가 필요합니다.으아아아
아무리 파일이 크더라도 각 줄의 길이가 제한되어 있는 한 전체 파일을 읽는 데는 많은 시간이 걸리지만 메모리를 많이 차지하지는 않습니다.
청크로 읽고 청크마다 하나의 결과 세트를 읽고 최종적으로 결과 세트를 집계합니다
텍스트를 처리할 때 줄 수를 아는 것이 더 좋습니다
linux
위의split
라는 명령이 있는데, 큰 텍스트를 작은 파일로 빠르게 동시에 분할할 수 있는데, 이 알고리즘을 외부 정렬이라고 합니다기억은 글을 다 쓰고 나면 넘기는 종이와 같습니다. 사용된 데이터와 사용되지 않은 데이터는 폐기됩니다.
간단한 예로 변수 버프를 만들고 크기를 설정한 후 파일 스트림을 열고 채워넣습니다. 채워 넣은 후 원하는 내용을 확인하면 다른 변수에 계산됩니다. 그런 다음 버프를 지우고 이전에 읽은 위치에서 다시 콘텐츠를 계속 로드합니다... 읽기가 완료될 때까지 통계가 완료됩니다.
다른 시스템의 경우 메모리보다 큰 파일을 작동할 수 있는 API가 제공됩니다. 즉, 파일이 메모리로 처리됩니다.
内存映射
mmap
파일 매핑 생성