1

約 2600 個の大規模な xml ファイル (解凍するとそれぞれ ~ 1 GB) があり、現在かなり密集して gzip 圧縮され、SSD に保存されています。これらのファイルには、それぞれ 23000 ~ 30000 レコードが含まれています。

これらのレコードを各レコードの比較的少量のデータにスケープし、そのデータをデータベースに永続化する必要があります。

私は (いくつかの基本的なテストで) スクレイピングを行うのに少なくとも 150 時間かかると見積もっています (データが非常に少ないため、永続化はかなり速いと思います)。

私は .NET の IO メソッドとそれらをより効率的にする方法にあまり詳しくないので、現在テストに使用しているメソッドを次に示します。

 public PCCompounds DoStuff(String file)
    {
        using(FileStream fs = this.LoadFile(file))
        {
            using (GZipStream gz = this.Unzip(fs))
            {
                using (XmlReader xml = this.OpenFile(gz))
                {
                    return (PCCompounds)this.ParseXMLEntity(xml);
                }
            }
        }
    }

    private FileStream LoadFile(String file)
    {
        return new FileStream(file, FileMode.Open);
    }

    private GZipStream Unzip(FileStream file)
    {
        return new GZipStream(file, CompressionMode.Decompress);
    }

    private XmlReader OpenFile(GZipStream file)
    {
        return XmlReader.Create(file);
    }

    private Object ParseXMLEntity(XmlReader xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(PCCompounds));

        return serializer.Deserialize(xml);
    }

残念ながら、これはstackoverflowでしか見つけられず、それらの回答のほとんどはやや不完全でした. Sasha Goldstein の .NET performance book も読みましたが、ディスク IO に関する彼のセクションは少し薄いです。

どんな提案でも大歓迎です。

4

1 に答える 1

3

これらのレコードを各レコードの比較的少量のデータにスケープし、そのデータをデータベースに永続化する必要があります。

次に、 をご覧になることをお勧めしますXmlReader。API は非常に扱いにくく、ややぎこちなく、正しく読み取れるようにするには多少の混乱とデバッグが必要ですが、多くの問題を回避できます。特に:

  • サブツリーに興味がないことがわかっている場合は、サブツリーをスキップできます
  • 必要のないオブジェクトをインスタンス化していない

もちろん、興味のあるビットについては、自明でない場合は、サブツリー リーダー (XmlReader親の特定のノードにスコープされているXmlReader) を作成し、それを にフィードXmlSerializer、複合体をオフロードすることができます。作業しXmlSerializerます(したがって、「次、次、次;スキップすることを決定する;次;サブツリーを介して逆シリアル化することを決定する」などを実行するだけです)。

ただし、最終的には。そのすべての IO をかみ砕く必要がありますが、これには時間がかかります。個人的には、おそらくxml を使用することは最善の方法ではないかもしれないという小さなフラグを立てたいと思います。はい、それはあなたが持っているものですが、プロジェクトを開始して、将来の出力をオーバーヘッドの少ないものに変更することを検討してください。

于 2013-08-19T12:54:30.397 に答える