0

我在远程位置有大约 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;
 }
4

2 回答 2

0

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

问题显然是我提供信息的那些看起来很无辜的 UI 元素。他们吃掉了太多的cpu,最终杀死了应用程序。最小化 UI 信息源有帮助(每分钟 1.5k 到最慢的 1.3k)。难以置信的!希望它可以帮助其他有类似问题的人。

于 2013-02-11T13:58:56.050 回答
0

您应该将您的tokenListfrom更改List<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 的评论。您的互联网连接速度很可能是这里的瓶颈。

于 2013-02-08T11:00:54.653 回答