>백엔드 개발 >Golang >두 가지 Golang 대용량 파일 읽기 솔루션

두 가지 Golang 대용량 파일 읽기 솔루션

藏色散人
藏色散人앞으로
2021-01-04 14:23:182587검색

다음 golang 튜토리얼 칼럼에서는 Golang에서 매우 큰 파일을 읽을 수 있는 두 가지 솔루션을 소개합니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

두 가지 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
    }
}

두 번째 해결 방법은 바이너리 파일을 읽을 때 개행 문자가 없는 경우 다음을 사용하는 것입니다. 다음 대용량 파일을 처리하는 동일한 솔루션
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

더 많은 관련 기술 기사를 보려면

go 언어 튜토리얼

칼럼을 방문하세요!

위 내용은 두 가지 Golang 대용량 파일 읽기 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제