2009-06-18 8 views
0

stringdictionaryをテキストファイルにエクスポートしようとしていますが、レコードが100万を超えています。ループを使用するとテキストファイルにエクスポートするのに3分以上かかります。StringDictionary To TextFile

これを行う方法はありますか?

よろしく

+0

詳細情報が必要です.... –

+1

今使っているエクスポート方法は何ですか? – Steef

+3

コードの一部を投稿してみるとよいでしょう。そのような方法で問題を見るのは簡単です。 – Mark

答えて

4

まあ、それはあなたが、輸出のために使用しているどのような形式に依存しますが、一般的には、大量のデータをエクスポートするための最大のオーバーヘッドは、I/Oになるだろう。これを減らすには、よりコンパクトなデータ形式を使用し、可能であれば(メモリコピーを避けるために)メモリ内のデータの操作を少なくします。

最初にチェックするのは、ディスクのI/O速度を調べ、書き込みを行うコードのプロファイリングを行うことです。

ディスクI/Oを最大限に活用している場合(現代のシステムでは数十MB /秒のディスク速度の良い割合で書き込むなど)、データを圧縮することを検討することができます書いてください。これはより多くのCPUを使用しますが、これを実行するとディスクに書き込む回数は少なくなります。また、読み込み側で同じボトルネックがある場合は、ファイルの読み込み速度が向上する可能性があります。

CPUを最大限に活用するには、データを書き込む前にデータに対する処理作業を少なくする必要があります。たとえばシリアライゼーションライブラリを使用している場合は、シンプルで特殊化されたデータ形式に切り替えるのが役に立ちます。あなたが必要とする最もシンプルなフォーマットを考えてみましょう。たぶん文字列の長さの単語とそれに続く文字列データそのもので、すべてのキーと値に対して繰り返されます。

+0

"シリアライゼーションライブラリを使用している場合は、これを避けて、よりシンプルで特殊なデータフォーマットに切り替えることが役に立ちます。 - またはより高速な直列化ライブラリを使用する; - p –

3

ほとんどの辞書構成では挿入順序が保持されないことに注意してください。繰り返し可能なファイルの内容が必要な場合は、その選択肢が貧弱になることがありますが、サイズによっては時間がかかる場合があります。これは(下)だけで30メガバイトの下で書くこと(輸出用)について3.5Sをとります。

StringDictionary data = new StringDictionary(); 
    Random rand = new Random(123456); 
    for (int i = 0; i < 1000000; i++) 
    { 
     data.Add("Key " + i, "Value = " + rand.Next()); 
    } 
    Stopwatch watch = Stopwatch.StartNew(); 
    using (TextWriter output = File.CreateText("foo.txt")) 
    { 
     foreach (DictionaryEntry pair in data) 
     { 
      output.Write((string)pair.Key); 
      output.Write('\t'); 
      output.WriteLine((string)pair.Value); 
     } 
     output.Close(); 
    } 
    watch.Stop(); 

明らかにパフォーマンスが書かれたばかり実際のデータのサイズに依存します。