2

サイズが 50GB 以上の Json ファイルがあります。以下は、Json の非常に小さなチャンクを読み取るために私が書いたものです。大きなファイルを読み取るには、これを変更する必要があります。

internal static IEnumerable<T> ReadJson<T>(string filePath)
{
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
    using (StreamReader sr = new StreamReader(filePath))
    {
        String line;
        // Read and display lines from the file until the end of
        // the file is reached.
        while ((line = sr.ReadLine()) != null)
        {
            byte[] jsonBytes = Encoding.UTF8.GetBytes(line);
            XmlDictionaryReader jsonReader = JsonReaderWriterFactory.CreateJsonReader(jsonBytes, XmlDictionaryReaderQuotas.Max);
            var myPerson = ser.ReadObject(jsonReader);
            jsonReader.Close();

            yield return (T)myPerson;
        }
    }
}
  1. 現在のコードで StreamReader を構築するときにバッファ サイズを指定すれば十分でしょうか?
  2. ここで間違っている場合は修正してください..バッファサイズは、基本的に、一度にディスクからメモリに読み込まれるデータの量を指定します。したがって、ファイルのサイズが 100MB で、バッファー サイズが 5MB の場合、ファイル全体が読み取られるまで、一度に 5MB がメモリに読み取られます。
  3. ポイント 3 の私の理解が正しいと仮定すると、このような大きなテキスト ファイルの場合、理想的なバッファー サイズはどれくらいになるでしょうか? int.Max サイズは悪い考えでしょうか? 64 ビット PC では、int.Max サイズは 2147483647 です。バッファ サイズはバイト単位で、約 2GB に評価されると思います。これ自体に時間がかかる可能性があります。バッファサイズとして100MB〜300MBのようなものを見ていました。
4

3 に答える 3

5

一度に (入力ファイルの) 1 行ずつ読み取ります。これは 10 バイトで、すべて 50 GB になる可能性があります。つまり、入力ファイルはどのように構成されているのでしょうか? また、入力 JSON にオブジェクト間の切れ目以外の改行がある場合、これは非常に問題になる可能性があります。

バッファーサイズは、各行の終わりを探すときに読み取る量に影響を与える可能性がありますが、最終的には、毎回改行を見つける必要があります (少なくとも、現在の書き込み方法)。

于 2012-08-22T08:18:48.753 に答える
0

したがって、これに関するあなたの主な問題は、境界がどこにあるかです。ドキュメントがJSONドキュメントであることを考えると、境界がクラスである可能性が高いと思われます。 50GBの大容量クラス。また、これらすべてのクラスをメモリ内で実際に必要とするわけではないと思いますが、サブセットのために全体を検索する必要があるかもしれません...おおよそ正しいと思いますか? もしそうなら、あなたの疑似コードは次のようなものだと思います

using a Json parser that accepts a streamreader (newtonsoft?)
read and parse until eof
  yield return your parsed class that matches criteria
  read and parse next class
end
于 2012-08-22T08:38:40.017 に答える
0

バッファサイズなどの詳細を心配する前に、まずさまざまなパーサーを比較する必要があると思います。DataContractJsonSerializer、 Raven JSON、またはNewtonsoft JSON
の違いは非常に重要です。

于 2012-08-22T08:34:26.877 に答える