language-agnostic - 受 CPU 限制的应用程序与受 IO 限制的应用程序

标签 language-agnostic data-processing

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

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

最佳答案

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

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

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

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

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

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

    关于language-agnostic - 受 CPU 限制的应用程序与受 IO 限制的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1623245/

    相关文章:

    language-agnostic - 非阻塞事件循环是如何工作的?

    design-patterns - AOP 是装饰器模式的一种吗?

    python - 如何在 Tensorflow 中按张量形状过滤数据集

    java - 向员工分配工作量的最佳策略

    machine-learning - 在训练/验证/测试中使用标准化或归一化参数

    language-agnostic - 选民最少,分为两半

    language-agnostic - 有什么更好的方法来创建一个接受许多参数的方法? (10+?)

    apache-nifi - Apache NiFi : Add column to csv using mapped values

    python - 使用 python (pandas) 对 CSV 文件进行条件合并

    language-agnostic - round() 和 trunc() 函数有什么区别?