【发布时间】:2012-03-28 18:46:04
【问题描述】:
我有 4 个字典,其中包含 200 到 6000 个字符的 800k 字符串。 当我将它加载到内存中时,它会占用大约 11 GB 的内存。 解析数据需要 2 分钟,输出数据需要 2 分钟。 有没有比我在下面使用的更快地输出数据? 我每秒只能获得 20-31 MB 的磁盘 IO,而且我知道硬盘驱动器可以做 800 次
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();
}
【问题讨论】:
-
一目了然,您正在执行两倍于所需的哈希查找。请改用
Dictionary.TryGetValue。如果返回 false 你知道它不存在,如果返回 true 你已经有了你的价值。留下评论,因为我没有时间在更高级别分析问题。另外....using块是你的朋友。如果对Write的任何调用抛出异常会发生什么?您不会随心所欲地在流后清理。 -
这对code review 来说可能是一个更好的问题,因为您实际上并没有遇到问题。
-
@M.Babcock 感谢我在代码审查中发布了它
-
@Tigran mswithfilenames 有我用来将哈希输出到正确位置的文件名
-
请不要在 SE 网站上交叉发布问题,因为这会给两个网站上的人带来不必要的重复和麻烦。
标签: c# performance dictionary disk-io