存储/使用包含20万个项目的数组是否可行?

时间:2013-10-22 15:53:27

标签: c# .net arrays vb.net performance

我有239个文本文件要在应用程序中处理,目前文件存储为资源,我所做的是当我需要读取该文件的内容时,只将其中一个资源加载到数组中,我完成了读取我将数组设置为Nothing的内容,当我需要读取其中一个时,我对其他文件也这样做。

会更好如果我在加载应用程序时将239个文件的所有文本文件内容加载到一个数组中?这将是一个大约200.000项目数的数组。

我认为将来要做的事情是生成一个包含所有239个文本文件内容的XML,然后将该XML加载到一个对象中以管理属性/属性,但此刻我不知道我知道如何生成XML如何正确读取,但现在知道200.000行/元素的对象/数组是否应该更好地管理而不是读取一些文件/ xml将是很好知道的我。

3 个答案:

答案 0 :(得分:2)

实际问题不是项目数,而是项目的总大小。在4 GB或更高的系统中,10 MB是没有问题的,当然,您可以相信系统会相应地进行分页。加载数组中的所有数据肯定会加快对它们的操作,并且您将避免不断调整数组的大小。

所以,我对此问题的看法是,如果你想加载所有项目,如果你想减轻磁盘负载并提高处理性能,那会更好。

答案 1 :(得分:1)

即使是10 MB,为什么要记住内存 除非您有特定的性能问题,否则不要扩展。

使用阵列时,您需要在创建阵列时进行调整 你知道前面的大小吗?

我会在时间处理一个文件 如果每个文件的大小相同,那么您可以为每个文件重复使用相同的数组。

如果您不知道每个文件的大小,则重复使用一次列出文件,因为它的大小为“容量”和“清除”不会释放容量,因此您不会受到调整大小的影响。
前面的大小将其设置为您期望的最大单个文件。

List.Capacity Property

答案 2 :(得分:1)

我们倾向于忘记一件事:Window的优秀缓存功能。如果你只是不关心自己的缓存并且阅读过程相当快(例如一个slurp),你可能会忽略缓存。

在其他情况下,我建议非常容易实现“MRU缓存”(MRU =最近使用的)。它们非常有效,可在几分钟内完成。

说,你想保留20个最常用的文件。只需创建一个列表。该列表将保存每个文件(在数组中)的内容和文件名。

每次尝试(重新读取)文件内容时,请先查看列表。 如果它在列表中,则将内容移动到列表的前面并返回内容。 如果它不在列表中,请读取文件并将其放在列表的前面。如果列表现在包含20个以上的元素,则丢弃列表的最后一个元素。

您可以根据需要增加“20”,并且将始终拥有内存中最近使用的前20个列表。

这是一些伪代码:

FileContents ReadFile(filename)
   i = List.IndexOf(filename) 
   if (i == NOTFOUND) 
     content = PhysicallyRead(filename)
   else
     content = List[i];
     List.RemoveItemAt(i);
   end
   List.InsertAt(0, content, filename)
   If List.Length > MAXLENGTH
     List.RemoveItemAt(MAXLENGTH)

我希望你明白这个主意。您唯一需要注意的是列表操作相当快。

使用数据库通常是最好的方法,尤其是当您必须过滤文件内容,逐行计算等等时。但是,如果速度真的至关重要,内存解决方案可能会更好。

但是,如果您想保持简单和可扩展性,请考虑使用先前答案中提到的嵌入式数据库解决方案(例如SQLite,Firebird嵌入式,嵌入式SQL Server)。

希望这有点帮助。

相关问题