Maison > développement back-end > Golang > le corps du texte

Deux solutions de lecture de gros fichiers Golang

藏色散人
Libérer: 2021-01-04 14:23:18
avant
2549 Les gens l'ont consulté

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
}
Copier après la connexion

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
    }
}
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
go
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal