다음 golang 튜토리얼 칼럼에서는 Golang에서 매우 큰 파일을 읽을 수 있는 두 가지 솔루션을 소개합니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
1. 스트림 처리 방법
2. 샤딩 처리
지난해 인터뷰에서 대용량 파일을 어떻게 처리하느냐는 질문을 받았습니다. 당시에는 별로 생각하지 않았습니다. 돌아와서 이 문제를 주의 깊게 연구하고 논의했으며, 예를 들어 몇 년 동안 실행된 로그 파일이 있습니다. 크기는 100G입니다. 이전 작업에 따르면 코드는 다음과 같이 작성될 수 있습니다.
위 코드는 수 메가바이트의 파일을 읽을 수 있지만 해당 파일이 자신과 메모리보다 큰 경우 직접 뒤집힐 것입니다. 위의 코드는 파일의 모든 내용을 메모리로 읽어들인 후 반환하기 때문입니다. 수 메가바이트의 파일이 있으면 메모리가 충분히 크지만 파일이 수백 메가바이트가 되면 감당할 수 없게 됩니다. 처리가 너무 쉽습니다. 그러면 두 가지 올바른 방법이 있습니다. 첫 번째는 스트림 처리를 사용하는 것입니다. 코드는 다음과 같습니다.func ReadFile(filePath string) []byte{ content, err := ioutil.ReadFile(filePath) if err != nil { log.Println("Read error") } return content }로그인 후 복사
두 번째 해결 방법은 바이너리 파일을 읽을 때 개행 문자가 없는 경우 다음을 사용하는 것입니다. 다음 대용량 파일을 처리하는 동일한 솔루션func ReadFile(filePath string, handle func(string)) error { f, err := os.Open(filePath) defer f.Close() if err != nil { return err } buf := bufio.NewReader(f) for { line, err := buf.ReadLine("\n") line = strings.TrimSpace(line) handle(line) if err != nil { if err == io.EOF{ return nil } return err } return nil } }로그인 후 복사
go 언어 튜토리얼func ReadBigFile(fileName string, handle func([]byte)) error { f, err := os.Open(fileName) if err != nil { fmt.Println("can't opened this file") return err } defer f.Close() s := make([]byte, 4096) for { switch nr, err := f.Read(s[:]); true { case nr < 0: fmt.Fprintf(os.Stderr, "cat: error reading: %s\n로그인 후 복사더 많은 관련 기술 기사를 보려면
위 내용은 두 가지 Golang 대용량 파일 읽기 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!