我在远程位置有大约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;
}
答案 0 :(得分:0)
您应该将tokenList
从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的评论。你的互联网连接速度很可能是瓶颈。
答案 1 :(得分:0)
问题显然是无辜的UI元素,我已经提供了信息。他们吃掉了这么多cpu,最终终止了应用程序。最小化UI信息提供帮助(每分钟1.5k到最慢的1.3k)。难以置信的!希望它可以帮助其他有类似问题的人。