5

对于使用大量数据的“数字运算”风格的应用程序(读取:“数百 MB,但不是 GB”,即它可以很好地放入操作系统旁边的内存中),将所有数据读入内存是否有意义首先在开始处理之前避免在读取大型相关数据集时可能使程序 IO 绑定,而不是从 RAM 加载它们?

这个答案在使用不同的数据支持之间会改变吗?即,无论您使用的是 XML 文件、平面文件、完整的 DBMS 等,答案是否相同?

4

2 回答 2

8

你的程序和它的瓶颈一样快。如果这样做可以提高整体性能,那么将数据存储在内存中是有意义的。但是,没有硬性规定可以提高性能。当你解决了一个瓶颈时,新的东西就会成为瓶颈。因此,解决一个问题可能会使性能提高 1% 或 1000%,具体取决于下一个瓶颈是什么。你正在改进的东西可能仍然是瓶颈。

我认为这些事情通常适合三个级别之一:

  1. 渴望的。当您需要磁盘或网络中的某些内容或计算结果时,您可以去获取或执行它。这是最简单的编程,最容易测试和调试但性能最差的。只要这方面不是瓶颈就可以了。
  2. 懒惰的。一旦你完成了一个特定的读取或计算,在一段时间内不要再做一次,这可能是几毫秒到永远。这会给您的程序增加很多复杂性,但如果读取或计算成本很高,则可以获得巨大的收益;和
  3. 过分渴望。这很像前两者的组合。结果被缓存,但不是进行读取或计算或请求,而是有一定数量的抢先活动来预测您可能想要的内容。就像您从文件中读取 10K 一样,您以后可能需要下一个 10K 块的可能性相当高。而不是延迟执行,以防万一它被请求。

从中吸取的教训是唐纳德·克努斯(Donald Knuth)的一句话(有些过度使用且经常被错误引用)“过早的优化是万恶之源”。急切和过分急切的解决方案会增加大量的复杂性,因此没有必要为不会产生有用好处的事情去做。

程序员经常犯错误,在确定他们是否需要以及是否有用之前创建了一些高度(据称)优化的版本。

我自己对此的看法是:在遇到问题之前不要解决问题

于 2009-10-26T05:42:22.537 回答
2

我猜想选择正确的数据存储方法会比你一次从磁盘读取还是根据需要从磁盘读取更有效。

大多数数据库表的每一行中的字段都有规则的偏移量。例如,一条customer记录可能有 50 个字节长,并且有一pants_size列从第 12 个字节开始。选择所有裤子尺码就像在偏移量 12、62、112、162、ad nauseum处获取值一样容易。

然而,XML 对于快速数据访问来说是一种糟糕的格式。您需要通过一堆可变长度的标签和属性来获取数据,并且您将无法立即从一条记录跳转到下一条记录。除非您将文件解析为上述数据结构。在这种情况下,您将拥有非常类似于 RDMS 的东西,所以就这样吧。

于 2009-10-26T06:35:11.860 回答