对于使用大量数据的“数字运算”风格的应用程序(读取:“数百 MB,但不是 GB”,即它可以很好地放入操作系统旁边的内存中),将所有数据读入内存是否有意义首先在开始处理之前避免在读取大型相关数据集时可能使程序 IO 绑定,而不是从 RAM 加载它们?
这个答案在使用不同的数据支持之间会改变吗?即,无论您使用的是 XML 文件、平面文件、完整的 DBMS 等,答案是否相同?
对于使用大量数据的“数字运算”风格的应用程序(读取:“数百 MB,但不是 GB”,即它可以很好地放入操作系统旁边的内存中),将所有数据读入内存是否有意义首先在开始处理之前避免在读取大型相关数据集时可能使程序 IO 绑定,而不是从 RAM 加载它们?
这个答案在使用不同的数据支持之间会改变吗?即,无论您使用的是 XML 文件、平面文件、完整的 DBMS 等,答案是否相同?
你的程序和它的瓶颈一样快。如果这样做可以提高整体性能,那么将数据存储在内存中是有意义的。但是,没有硬性规定可以提高性能。当你解决了一个瓶颈时,新的东西就会成为瓶颈。因此,解决一个问题可能会使性能提高 1% 或 1000%,具体取决于下一个瓶颈是什么。你正在改进的东西可能仍然是瓶颈。
我认为这些事情通常适合三个级别之一:
从中吸取的教训是唐纳德·克努斯(Donald Knuth)的一句话(有些过度使用且经常被错误引用)“过早的优化是万恶之源”。急切和过分急切的解决方案会增加大量的复杂性,因此没有必要为不会产生有用好处的事情去做。
程序员经常犯错误,在确定他们是否需要以及是否有用之前创建了一些高度(据称)优化的版本。
我自己对此的看法是:在遇到问题之前不要解决问题。
我猜想选择正确的数据存储方法会比你一次从磁盘读取还是根据需要从磁盘读取更有效。
大多数数据库表的每一行中的字段都有规则的偏移量。例如,一条customer
记录可能有 50 个字节长,并且有一pants_size
列从第 12 个字节开始。选择所有裤子尺码就像在偏移量 12、62、112、162、ad nauseum处获取值一样容易。
然而,XML 对于快速数据访问来说是一种糟糕的格式。您需要通过一堆可变长度的标签和属性来获取数据,并且您将无法立即从一条记录跳转到下一条记录。除非您将文件解析为上述数据结构。在这种情况下,您将拥有非常类似于 RDMS 的东西,所以就这样吧。