ホームページ バックエンド開発 Golang golang が大きなファイルを処理する方法

golang が大きなファイルを処理する方法

Apr 27, 2023 am 09:11 AM

開発では、大きなファイルを処理する必要がある場面がよくありますが、効率的で同時処理に適した言語である Go 言語は、必然的に大きなファイルの処理を伴います。大きなファイルの読み取り、書き込み、または変更を行う場合は、次のようないくつかの問題を考慮する必要があります。 メモリ リークを回避するにはどうすればよいですか?効率的に対処するにはどうすればよいでしょうか?この記事では、大きなファイルを処理するためのいくつかの方法を紹介し、プログラムのクラッシュを避けるために大きすぎるファイルを処理する方法に焦点を当てます。

  1. セグメンテーション処理を使用する

一般的に、大きなファイルの読み取り、書き込み、変更のいずれを行う場合でも、メモリ リークやプログラムのクラッシュを回避する方法を考慮する必要があります。大きなファイルを効率的に処理するために、大きなファイルを複数の小さなファイルに分割し、小さなファイルを読み書きする分割処理がよく使用されます。

Go 言語では、io.LimitReader() メソッドと io.MultiReader() メソッドを使用してファイルを分割し、大きなファイルを複数の小さなファイルに分割できます。 . ファイルはマルチスレッドを使用して処理されます。

次のコードで 500MB を超える大きなファイルを読み取ります:

var (
    maxSize int64 = 100 * 1024 * 1024 //100MB
)
func readBigFile(filename string) (err error) {
    file, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer file.Close()

    fileInfo, err := file.Stat()
    if err != nil {
        return err
    }

    if fileInfo.Size() <= maxSize {
        _, err = io.Copy(os.Stdout, file)
    } else {
        n := (fileInfo.Size() + (maxSize - 1)) / maxSize
        var err error
        for i := int64(0); i < n; i++ {
            eachSize := maxSize
            if i == n-1 {
                eachSize = fileInfo.Size() - (n-1)*maxSize
            }
            sectionReader := io.NewSectionReader(file, i*maxSize, eachSize)
            _, err = io.Copy(os.Stdout, sectionReader)
            if err != nil {
                return err
            }
        }
    }
    return nil
}
ログイン後にコピー

上記のコードでは、読み取られたファイル サイズが最大許容値を超えると、複合読み取り方式が使用され、大きなサイズを分割します。ファイルを同じサイズの複数のブロックに分割して読み取り、最後にそれらを最終結果にマージします。

上記の方法は、もちろん大きなファイルの読み取りプロセスに最適化されていますが、場合によってはファイルの書き込みが必要になることもあります。

  1. 大きなファイルを書き込む

Go で大きなファイルを書き込む最も簡単な方法は、bufio.NewWriterSize() 関数パッケージ Go を使用することです。 os.File() に書き込み、書き込み前に現在のバッファがいっぱいかどうかを確認します。バッファがいっぱいになったら、Flush() メソッドを呼び出して、バッファ内のデータをハードディスク。 。大きなファイルを書き込むこの方法はシンプルで実装が簡単で、大きなファイルの書き込みに適しています。

    writer := bufio.NewWriterSize(file, size)
    defer writer.Flush()
    _, err = writer.Write(data)
ログイン後にコピー
  1. 大きな CSV ファイルの処理

大きなファイルの読み取りと書き込みに加えて、大きな CSV ファイルも処理する場合があります。 CSV ファイルを処理する場合、ファイルが大きすぎるとプログラムのクラッシュが発生するため、これらの大きな CSV ファイルを処理するにはいくつかのツールを使用する必要があります。 Go 言語には、大きな CSV ファイルを高速に処理するという目的を達成するために、複数のファイルを同時に処理できるゴルーチンとチャネルと呼ばれる機構が用意されています。

Go 言語では、csv.NewReader() メソッドと csv.NewWriter() メソッドを使用して、CSV ファイルの読み取りと書き込みのためのプロセッサをそれぞれ構築できます。 、ファイルを 1 行ずつスキャンしてデータを読み取ります。 CSV ファイルのパイプラインを使用して、データを行ごとに保存する方法を処理します。

func readCSVFile(path string, ch chan []string) {
    file, err := os.Open(path)
    if err != nil {
        log.Fatal("读取文件失败:", err)
    }
    defer file.Close()
    reader := csv.NewReader(file)
    for {
        record, err := reader.Read()
        if err == io.EOF {
            break
        } else if err != nil {
            log.Fatal("csv文件读取失败:", err)
        }
        ch <- record
    }
    close(ch)
}

func writeCSVFile(path string, ch chan []string) {
    file, err := os.Create(path)
    if err != nil {
        log.Fatal("创建csv文件失败:", err)
    }
    defer file.Close()
    writer := csv.NewWriter(file)
    for record := range ch {
        if err := writer.Write(record); err != nil {
            log.Fatal("csv文件写入失败: ", err)
        }
        writer.Flush()
    }
}
ログイン後にコピー

上記のコードでは、csv.NewReader() メソッドを使用してファイルを走査し、データの各行を配列に格納して、その配列をチャネルに送信します。 CSV ファイルの読み取り中に、ゴルーチンとチャネルを使用してファイル全体を同時にスキャンしました。読み取り後、チャネルを閉じて、ファイルの読み取りが完了したことを示します。

上記の方法により、大きなファイルを処理するときにデータ全体をメモリに読み込む必要がなくなり、メモリ リークやプログラムのクラッシュが回避され、プログラムの実行効率も向上します。

概要:

上記の紹介では、分割処理の使用、大きなファイルの書き込み、大きな CSV ファイルの処理など、大きなファイルを処理するいくつかの方法について説明しました。実際の開発では、ビジネス ニーズに基づいて大きなファイルを処理する適切な方法を選択し、プログラムのパフォーマンスと効率を向上させることができます。同時に、大きなファイルを処理する場合は、メモリの問題に焦点を当て、メモリ使用量を合理的に計画し、メモリ リークを回避する必要があります。

Go 言語を使用して大きなファイルを処理する場合、ゴルーチンやチャネルなどの Go 言語の機能を最大限に活用して、プログラムが大きなファイルを効率的に処理し、メモリ リークやプログラムのクラッシュを回避できます。この記事では比較的基本的な内容を紹介しますが、これらの方法は開発中の大きなファイルの処理に適用できるため、プログラムのパフォーマンスと効率が向上します。

以上がgolang が大きなファイルを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golangの目的:効率的でスケーラブルなシステムの構築 Golangの目的:効率的でスケーラブルなシステムの構築 Apr 09, 2025 pm 05:17 PM

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golangの影響:速度、効率、シンプルさ Golangの影響:速度、効率、シンプルさ Apr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

CとGolang:パフォーマンスが重要な場合 CとGolang:パフォーマンスが重要な場合 Apr 13, 2025 am 12:11 AM

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

See all articles