Maison  >  Article  >  développement back-end  >  Deux solutions de lecture de gros fichiers Golang

Deux solutions de lecture de gros fichiers Golang

藏色散人
藏色散人avant
2021-01-04 14:23:182483parcourir

La colonne suivante du tutoriel Golang vous présentera deux solutions pour lire des fichiers très volumineux dans Golang. J'espère qu'elle sera utile aux amis dans le besoin !

Deux solutions de lecture de gros fichiers Golang

Deux solutions pour lire des fichiers très volumineux dans Golang

1 Méthode de traitement du flux

2. Traitement des films

Lors de l'interview de l'année dernière, on m'a demandé comment gérer les fichiers très volumineux. Je n'ai vraiment pas beaucoup réfléchi à cette question à l'époque. Après mon retour, j'ai étudié et discuté cette question attentivement et. a fait une analyse de la lecture de fichiers volumineux.

Par exemple, nous avons un fichier journal qui fonctionne depuis plusieurs années et fait 100 Go. D'après notre opération précédente, le code peut s'écrire ainsi :

func ReadFile(filePath string) []byte{
    content, err := ioutil.ReadFile(filePath)
    if err != nil {
        log.Println("Read error")
    }
    return content
}

Le code ci-dessus peut lire un fichier de plusieurs mégaoctets, mais s'il est plus gros que le vôtre et sa mémoire, il va directement se renverser. Parce que le code ci-dessus lit tout le contenu du fichier dans la mémoire puis le renvoie. Si vous avez un fichier de plusieurs mégaoctets, votre mémoire est suffisamment grande pour le gérer, mais une fois que le fichier atteint des centaines de mégaoctets, il ne le sera plus. si facile à traiter. Ensuite, il existe deux méthodes correctes. La première consiste à utiliser le traitement de flux. Le code est le suivant :

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
    }
}

La deuxième solution consiste à fragmenter le traitement. il n'y a pas de caractère de nouvelle ligne, utilisez la solution suivante pour traiter les fichiers volumineux

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

Pour plus d'articles techniques connexes, veuillez visiter la colonne tutoriel du langage go !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer