【问题标题】:CPU bound applications vs. IO bound受 CPU 限制的应用程序与受 IO 限制的应用程序
【发布时间】:2009-10-26 05:36:51
【问题描述】:

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

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

【问题讨论】:

  • @Brendan,“而不是从 RAM 加载它们”和“而不是 of 从磁盘加载它们”都意味着同样的事情。啊,英语的奇迹:-)
  • 是的,完全看错了。我以为它说的是“而不是从 RAM 中加载它们”。我的错。

标签: language-agnostic data-processing


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 在我正在使用的特定情况下,我无法选择数据存储:这是由我必须使用的第三方应用程序决定的。 +1 以提出一些好的观点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多