从性能的角度来看,从 XML 文件中读取大量数据还是通过数组循环更有利?
我有大约 2,000 个数据集需要循环并进行计算,所以我只是想知道是导入所有 XML 数据并将其作为数组处理(单个大型导入)还是顺序导入每个数据集(很多小进口)。
想法和建议?
从性能的角度来看,从 XML 文件中读取大量数据还是通过数组循环更有利?
我有大约 2,000 个数据集需要循环并进行计算,所以我只是想知道是导入所有 XML 数据并将其作为数组处理(单个大型导入)还是顺序导入每个数据集(很多小进口)。
想法和建议?
如果我正确解释了您的问题,您需要从一个文件中加载 2,000 组数据,然后将它们全部处理。所以你必须读取所有数据并处理所有数据。在基本层面上,有相同数量的工作要做。
所以我认为问题是“我怎样才能更早地完成相同的处理?”
考虑:
数据将使用多少内存?如果它超过 1.5GB 的 RAM,那么您将无法在 32 位 PC 上一次性处理它,即使在 64 位 PC 上,您也可能会看到虚拟内存分页导致性能下降. 在任何一种情况下,都需要以较小的块流式传输数据。
相反,如果数据很小(例如,据我所知,2000 条记录可能只有 200kB),那么您可以通过在一个块中读取它来获得更好的 I/O 性能,或者与处理时间相比它的加载速度非常快,以至于没有必要尝试优化它。
记录是独立的吗?(因此它们不需要按特定顺序处理,并且您不需要内存中存在一条记录来处理另一条记录)如果是这样,并且总体上加载时间很长,那么“最佳”方法可能是并行化操作 - 如果您可以在后台加载更多数据的同时处理一些数据,您将更好地利用硬件并在更短的时间内完成相同的工作。因此,您可能需要考虑将加载和处理拆分到不同的线程上。
但是,如果加载时间比处理时间长得多,将处理分散到多个线程上可能对您没有帮助,因为您的处理线程在等待 I/O 时可能会缺乏数据 - 因此使用 1 个处理线程可能与使用 3 个或 7 个处理线程一样快. 并且创建比可用 CPU 内核更多的线程是没有意义的。如果要使用多线程,我会编写它以使用可配置/动态数量的线程,然后进行一些测试以确定最佳方法是什么。
但在考虑所有这些之前,您可能需要考虑编写一种蛮力方法,看看性能如何。你甚至需要优化它吗?
如果答案是“是的,我迫切需要优化它”,那么您是否可以重新考虑数据格式?XML 是一种非常有用但效率极低的格式。如果你有一个性能关键的情况,你可以做些什么来减少 XML 大小(例如,简单地使用较短的元素名称可以对大文件产生巨大的影响),或者甚至使用更紧凑且易于阅读的二进制格式?