0

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

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

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

4

3 回答 3

2

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

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

于 2013-10-22T16:18:25.320 回答
1

我们往往会忘记一件事:Window 出色的缓存功能。如果您只是不关心缓存自己并且读取过程相当快(例如一个 single 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 嵌入式)。

希望这个对你有帮助。

于 2013-10-22T17:35:25.270 回答
1

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

使用数组时,您需要在创建它时调整其大小。
你知道知道前面的尺寸吗?

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

如果您不知道每个文件的大小,请一次重用一个 List 一个文件,因为它的大小为容量,并且 Clear 不会释放容量,因此您不会受到调整大小的影响。
预先大小将其设置为您期望的最大单个文件。

List.Capacity 属性

于 2013-10-22T16:37:22.813 回答