繁体   English   中英

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

[英]Would it be feasible to store/use an array with 200 thousand items?

我有239个文本文件要在应用程序中处理,此刻文件存储为资源,当需要读取文件内容时,我要做的就是将一个资源仅加载到Array中。读取将Array设置为Nothing的内容,并且在需要读取其中一个文件时对其他文件执行相同的操作。

如果在加载应用程序时将239个文件的所有文本文件内容加载到Array中会更好吗? 总共约有200.000个项目计数的数组。

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

实际的问题不是多少个项目,而是项目 的总大小是 多少 在具有4 GB或更大容量的系统中,10 MB没问题,当然,您可以相信系统可以相应地分页。 最肯定的是,将所有数据加载到数组中将加快对其的操作,并且您将避免不断调整数组的大小。

因此,我对此事的看法是,如果要减轻磁盘负载并提高处理性能,则最好是装载所有项目。

即使只有10 MB,为什么还要占用内存。
除非您遇到特定的性能问题,否则不要扩展规模。

对于数组,创建时需要调整大小。
您知道前面的尺寸吗?

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

如果您不知道每个文件的大小,请一次重用一个文件列表,因为它的大小为“容量”,而“清除”不会释放容量,因此您不会承受调整大小的麻烦。
前端大小将其设置为您期望的最大单个文件大小。

列表容量属性

我们往往会忘记一件事: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嵌入式),如先前答案所述。

希望这个对你有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM