从c#中的文件计算统计信息的最佳方法
本文关键字:信息 最佳 方法 统计 文件 计算 | 更新日期: 2023-09-27 17:58:14
我在远程位置有大约300k个图像文件。我下载(必须)并将这些文件的详细信息写入一个文本文件(带有一些附加信息)。由于我得到的信息的性质,我必须在每个文件到达时处理它们(我还将每个文件的信息写入文件行),以获得某种形式的统计信息。例如,我有一个具有属性大小和计数的对象列表,以查看我有多少特定大小的图像。
我还考虑过在不保留任何统计信息的情况下将所有内容读写到文件中,这样我就可以再次打开文件添加统计信息。但我想不出一种方法来处理一个250k行的统计信息多属性文件。
我知道这些列表(是的,我有两个),每个项目的常量循环都会让应用程序出错,但还有其他方法吗?现在已经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;
}
您应该将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的评论。你的网速很可能是这里的瓶颈。
嗯,我认为可能是编码问题。有些问题确实存在。按照Daniel Hilgarth的指示,换成字典帮助很大,但只是前30分钟。然后情况每分钟都在恶化。
问题显然是我提供的信息中那些看起来很无辜的UI元素。它们消耗了太多的cpu,最终导致应用程序崩溃。最小化UI信息源有帮助(每分钟1.5k到最慢1.3k)。难以置信!希望它能帮助其他有类似问题的人。