golang が大きなファイルを処理する方法
開発では、大きなファイルを処理する必要がある場面がよくありますが、効率的で同時処理に適した言語である Go 言語は、必然的に大きなファイルの処理を伴います。大きなファイルの読み取り、書き込み、または変更を行う場合は、次のようないくつかの問題を考慮する必要があります。 メモリ リークを回避するにはどうすればよいですか?効率的に対処するにはどうすればよいでしょうか?この記事では、大きなファイルを処理するためのいくつかの方法を紹介し、プログラムのクラッシュを避けるために大きすぎるファイルを処理する方法に焦点を当てます。
- セグメンテーション処理を使用する
一般的に、大きなファイルの読み取り、書き込み、変更のいずれを行う場合でも、メモリ リークやプログラムのクラッシュを回避する方法を考慮する必要があります。大きなファイルを効率的に処理するために、大きなファイルを複数の小さなファイルに分割し、小さなファイルを読み書きする分割処理がよく使用されます。
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 }
上記のコードでは、読み取られたファイル サイズが最大許容値を超えると、複合読み取り方式が使用され、大きなサイズを分割します。ファイルを同じサイズの複数のブロックに分割して読み取り、最後にそれらを最終結果にマージします。
上記の方法は、もちろん大きなファイルの読み取りプロセスに最適化されていますが、場合によってはファイルの書き込みが必要になることもあります。
- 大きなファイルを書き込む
Go で大きなファイルを書き込む最も簡単な方法は、bufio.NewWriterSize()
関数パッケージ Go を使用することです。 os.File()
に書き込み、書き込み前に現在のバッファがいっぱいかどうかを確認します。バッファがいっぱいになったら、Flush()
メソッドを呼び出して、バッファ内のデータをハードディスク。 。大きなファイルを書き込むこの方法はシンプルで実装が簡単で、大きなファイルの書き込みに適しています。
writer := bufio.NewWriterSize(file, size) defer writer.Flush() _, err = writer.Write(data)
- 大きな 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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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