在c#中从文件计算统计信息的最佳方法

时间:2013-02-08 10:51:48

标签: c#

我在远程位置有大约300k图像文件。我下载(必须)并将这些文件的详细信息写入文本文件(附带一些其他信息)。由于我得到的信息的性质,我必须处理每个文件(我也将每个文件信息写入文件行)以获取某种形式的统计信息,例如,我有一个带有属性的对象列表大小和数量,以查看我有多少尺寸的图像。

我还考虑过将所有内容读取和写入文件,而不保留任何统计信息,我可以再次打开文件来添加统计信息。但我想不出有办法处理250k行多属性文件以获取统计信息。

我知道列表(是的,我有2个)并且每个项目的常量循环都会使应用程序陷入困境,但还有另一种方法吗?现在已经2个小时了,申请仍然是26k。对于每个图像项目,我做这样的事情以保持计数,我检查图像是否具有之前确定的特定尺寸,我将其添加到该列表项目。

public void AddSizeTokens(Token token)
{
  int index = tokenList.FindIndex(item => item.size== token.size);
  if (index >= 0)
    tokenList[index].count+=1;
  else
    tokenList.Add(token);
}

我写的文件中的哪一行看起来像

Hits    Size     Downloads     Local Loc                   Virtual ID
204     88.3        4212        .../someImage.jpg       f-dd-edb2-4a64-b42

我正在下载如下文件;

try
{
   using (WebClient client = new WebClient())
   {
     if (File.Exists(filePath + "/" + fileName + "." + ext))
     {
        return "File Exists: " + filePath + "/" + fileName + "." + ext;
     }
     client.DownloadFile(virtualPath, filePath + "/" + fileName + "." + ext);
     return "Downloaded: " + filePath + "/" + fileName + "." + ext;
   }
 }
 catch (Exception e)  {
      return"Problem Downloading " + fileName + ": " + e.Message;
 }

2 个答案:

答案 0 :(得分:0)

您应该将tokenListList<Token>更改为Dictionary<long, Token> 关键是尺寸。

您的代码如下所示:

Dictionary<long, Token> tokens = new Dictionary<long, Token>();

public void AddSizeTokens(Token token)
{
    Token existingToken;
    if(!tokens.TryGetValue(token.size, out existingToken))
        tokens.Add(token.size, token);
    else
        existingToken.count += 1;
}

这将把它从O(n)操作改为O(1)操作。

要考虑的另一点是Destrictor的评论。你的互联网连接速度很可能是瓶颈。

答案 1 :(得分:0)

嗯,我想也许编码就是问题所在。有些问题确实如此。根据Daniel Hilgarth的说明,改用字典有很多帮助,但只有前30分钟。然后每分钟都在恶化。

问题显然是无辜的UI元素,我已经提供了信息。他们吃掉了这么多cpu,最终终止了应用程序。最小化UI信息提供帮助(每分钟1.5k到最慢的1.3k)。难以置信的!希望它可以帮助其他有类似问题的人。