我有一个巨大的数据文件,我只需要来自此文件的特定数据,稍后,我将经常使用这些数据。 那么这两种方法中哪一种更有效:
我应该提到这些数据可能是大量的整数。 上面提到的哪两种方法可以在速度和内存方面提供更好的性能?
答案 0 :(得分:4)
如果文件I / O开销不是您的问题:将它们保存在文件中并创建索引文件,将键映射到文件位置,这样您就不必读取大文件。
如果数据适合您的RAM并且您希望能够快速访问它 - 请使用第一种方法(但可能没有索引文件),但在启动时或第一次需要时将数据读入内存。 / p>
答案 1 :(得分:3)
只要它适合内存,使用内存肯定会有一些数量级更快。但是不要使用LinkedList
- 它有很大的开销。并且根本不使用任何标准Collection,因为它意味着拳击并且至少将内存开销减少3倍。
您可以使用int[]
或专门的集合来处理原始类型。
我建议您通过java.nio.IntBuffer
使用文件。这样,数据主要驻留在磁盘上,但也会映射到内存中。
答案 2 :(得分:0)
可能是第一个。
但确实没有足够的信息可以正确回答你。
首先,如果您只按顺序遍历链接列表,则链接列表很好。但是,如果你需要随机访问它(第5个元素,然后是第100个元素,然后是第12个元素,然后是第12个元素,那么第45个......),它很糟糕,你会更好地使用ArrayList或其他东西。其次,如果你要存储大量的int,如果你使用其中一个标准Java集合,每个int都将被装箱,这可能会带来性能开销。
然后你还没有说'巨大'意味着什么。成千上万的?百万?
所以,是的,你需要说明你正在处理什么样的数字,以及访问模式可能是什么。 “过滤”步骤是一次性的 - 还是经常完成?
答案 3 :(得分:0)
这取决于系统规格,如果您为一台机器设计应用程序 - 任务很简单,在其他地方您应该考虑客户计算机上的内存和/或磁盘空间限制。
我认为你无法比较这两种态度的表现,因为每一种都有它自己的利弊。我确定有一些可用的算法可以进一步调查,连接读取文件的一部分到内存中,或者创建一个缓存(当你从文件中读取一个数字时,将它存储在内存中,所以下次你加载它 - 它将存储在内存中。