Go の限られた RAM での高速ファイル読み取り
はじめに
大きなファイルの解析は、特にシステム メモリが限られている場合、これは困難です。このガイドでは、最小限の RAM 使用率で Go で大量のテキスト、JSON、CSV ファイルを読み取り、処理するための最も効率的なアプローチについて説明します。
ドキュメントとストリームの解析
2 つの主要な解析方法は、ドキュメント解析とストリーム解析です。ドキュメント解析により、ファイル全体がメモリ内のデータ構造に変換され、クエリと操作が便利になります。ただし、この方法では、ファイル全体をメモリに保存する必要があります。
ストリーム解析では、ファイルを一度に 1 要素ずつ読み取るため、即時処理が可能になります。この方法ではメモリが節約されますが、データは利用可能になったときに処理する必要があります。
Go のファイル処理ライブラリ
Go は、CSV、 JSONとXML。これらのライブラリは、ドキュメントとストリームの両方の解析に効率的なメカニズムを提供します。
CSV ファイルの処理
CSV ファイルは、encoding/csv パッケージを使用して解析できます。ファイル全体をメモリにロードすることも、ストリーム パーサーを使用して行を 1 つずつ処理することもできます。
JSON および XML ファイルの処理
Go 標準ライブラリは、エンコーディングを提供します。 JSON および XML ファイルを処理するための /json および encoding/xml パッケージ。これらのパッケージは、ドキュメントの解析とストリーミングの両方を提供します。
チャネルによる同時実行
ファイルの処理時に同時実行を活用するには、チャネルを使用できます。他の並行プロセスにデータを非同期的にフィードするためのチャネルとゴルーチンを作成します。
例
次のコードは、CSV ファイルを非同期的に処理する方法を示しています。
<code class="go">package main import ( "encoding/csv" "fmt" "log" "os" "io" ) func main() { file, err := os.Open("test.csv") if err != nil { log.Fatal(err) } parser := csv.NewReader(file) records := make( chan []string ) go func() { defer close(records) for { record, err := parser.Read() if err == io.EOF { break } if err != nil { log.Fatal(err) } records <- record } }() print_records( records ) } func print_records( records chan []string ) { for record := range records { fmt.Println(record) } }</code>
以上が限られた RAM で Go で大きなファイルを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。