【问题标题】:Performance of Reading from a file vs. an ArrayList从文件读取与 ArrayList 的性能
【发布时间】:2010-02-10 17:37:45
【问题描述】:

为了训练和测试我的 AI 算法,我必须使用从文件中读取的数千条数据,并重复使用这些数据数百次。现在,我有两种可能的解决方案。一种是每次我需要使用成千上万的数据时直接从文件中读取。另一种是从文件中读取数据并将数据存储到一个 ArrayList 中,然后通过循环重复使用该 ArrayList。哪种方式更快?如果可能的话,有人可以为我提供这两种方法的大符号吗?另外,是否有一种全新的方法来解决这个问题,可以减少读取过度泛滥的数据所需的时间?

【问题讨论】:

    标签: performance file-io arraylist coding-efficiency


    【解决方案1】:

    您应该为两者编写一个简单的性能测试,但我很确定从磁盘读取并通过您的 arraylist 将结果缓存到内存中每次都会获胜。文件 IO 的开销/延迟将导致您的结果随着您读取的项目数量的增加而出现差异。

    【讨论】:

    • 分布式缓存(如 memcache)或实现您自己的 LRU 算法(可能会过度使用 memcache)是解决本地内存限制的一种解决方案。
    【解决方案2】:

    您是串行使用数据还是以随机访问方式使用数据?如果它是随机访问的,那么将它加载到内存中可能会更快,因为您不必移动文件指针。如果您需要分配内存来在每次迭代中对数据进行操作,将会有很大的损失,但如果没有更多信息,我无法说出它是什么。

    如果您串行访问数据,那么这两种方法之间的“big-o”没有区别。它完全依赖于操作系统和物理架构。在具有良好文件系统缓存的良好操作系统上,这两种方法应该相似,缓存在数组列表中的速度优势和读取文件的空间优势,因为您不必保留内存分配。

    我最好的建议是在您的目标操作系统和 CPU 上实现这两种方法并为其计时。由于 CPU 处理速度、CPU 内存缓存、RAM 和磁盘访问之间的速度存在数量级差异,当您有两个具有相同 big-o 的算法时,现代架构的性能非常难以预测。

    【讨论】:

      【解决方案3】:

      我认为:

      • 从 ArrayList 读取要快得多。
      • 大O是一样的,只是运算的时间单位不同

      如果您的内存不足以容纳所有这些,就会出现问题。 然后你必须求助于使用文件,用速度换取(内存)大小。

      【讨论】:

        【解决方案4】:

        正如其他人所说,大 O 分析将是相同的。

        这是因为您总是第一次读取所有数据,然后每次都以相同的方式重用数据。

        这是一个很好的例子,说明了为什么渐近分析并不总是足够的:这里你的差异将是由于内存与磁盘 I/O。磁盘 I/O 往往需要几毫秒;内存将需要微秒,如果您的数据可以以正确的方式缓存,可能会接近纳秒。

        如果不是所有内容都适合内存,那么您真的别无选择,只能使用文件读取方法。而且会很慢。但不幸的是,有时情况就是这样。

        【讨论】:

        • 如果他溢出到虚拟内存中,则相对于从磁盘读取没有性能损失。如果他将内存加载到内存中,他会通过添加更多内存来获得收益。
        • 好的,我的回答是假设他的物理内存相当高,当然。但是正如您所指出的,如果他有很多内存并将其全部加载到内存中,他就会受益。这正是我的回答所说的。假设你是给出-1的人,我认为你有点过于挑剔了。总而言之,内存比磁盘快,这就是我想说的重点。
        【解决方案5】:

        无需大 O 分析。内存 I/O 总是优于磁盘 I/O(移动部件)。只需研究基于内存的排序算法与基于磁盘的排序算法,您就会明白。

        当您的数据太多以至于无法放入内存时,应考虑磁盘 I/O。

        【讨论】:

        • 不是真的,现在我们有了固态硬盘。
        • 固态硬盘的速度仍然不比内存快。
        • 赞成取消理由不充分的反对票。做一些研究,好吗?
        • 感谢白金。一旦我看到对您完全有效的答案的反对票,我也想做同样的事情,但我是新来的,没有足够的分数来投票。
        • 白金,我回了人情以扭转不合理的反对票。
        猜你喜欢
        • 1970-01-01
        • 2011-12-04
        • 2015-01-03
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多