私は200kから6000文字の800kの文字列を含む4つの辞書を持っています。 メモリにロードすると、約11ギガバイトのメモリが必要になります。 データを解析するのに2分、データを出力するのに2分かかります。 私が以下で使用しているものより速くデータを出力するには、とにかくありますか? 私は第二のディスクIOあたり20〜31メガバイトを取得していますし、私は、ハードドライブが800ish最適に出力する辞書
var hash1 = new Dictionary<int, Dictionary<string, string>>(f.Count + 2);
var hash2 = new Dictionary<int, Dictionary<string, string>>(f.Count + 2);
var hash3 = new Dictionary<int, Dictionary<string, string>>(f.Count + 2);
var hash4 = new Dictionary<int, Dictionary<string, string>>(f.Count + 2);
....
foreach (var me in mswithfilenames)
{
filename = me.Key.ToString();
string filenamef = filename + "index1";
string filenameq = filename + "index2";
string filenamefq = filename + "index3";
string filenameqq = filename + "index4";
StreamWriter sw = File.AppendText(filenamef);
StreamWriter sw2 = File.AppendText(filenameq);
StreamWriter swq = File.AppendText(filenamefq);
StreamWriter sw2q = File.AppendText(filenameqq);
for (i = 0; i <= totalinhash; i++)
{
if (hashs1[i].ContainsKey(filenamef))
{
sw.Write(hashs1[i][filenamef]);
}
if (hashs2[i].ContainsKey(filenameq))
{
sw2.Write(hashs2[i][filenameq]);
}
if (hashs3[i].ContainsKey(filenamefastaq))
{
swq.Write(hash4[i][filenamefastaq]);
}
if (hash4[i].ContainsKey(filenameqq))
{
sw2q.Write(hash4[i][filenameqq]);
}
}
sw.Close();
sw2.Close();
sw3.Close();
sw4.Close();
swq.Close();
sw2q.Close();
}
一見、必要な数のハッシュ検索を2回実行しています。代わりに 'Dictionary.TryGetValue'を使用してください。それが偽を返す場合、それが存在しないことを知っています、それが真を返すなら、あなたは既にあなたの価値を持っています。私は問題をより高いレベルで分析する時間がないので、コメントとして残しておきます。また.... 'using'ブロックはあなたの友人です。 'Write'への呼び出しのどれかが例外をスローするとどうなりますか?あなたはあなたのストリームの後にあなたが好きなだけ素早くクリーンアップすることはありません。 –
実際に問題に遭遇していないので、[コードレビュー](http://codereview.stackexchange.com)の方がより良い質問になるかもしれません。 –
'mswithfilenames'とは何ですか? – Tigran