1

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

4

5 回答 5

2

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

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

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

于 2010-02-10T17:51:13.823 回答
2

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

于 2010-02-10T17:42:16.447 回答
1

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

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

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

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

于 2010-02-10T17:54:42.787 回答
1

我觉得:

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

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

于 2010-02-10T17:43:15.760 回答
0

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

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

于 2010-02-10T17:50:20.220 回答