CPU绑定应用程序与IO绑定

时间:2009-10-26 05:36:51

标签: language-agnostic data-processing

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

这个答案是否会在使用不同的数据备份之间发生变化?即,无论您使用的是XML文件,平面文件,完整的DBMS等,答案都是一样的吗?

2 个答案:

答案 0 :(得分:8)

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

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

  1. 渴望。当您需要来自磁盘或网络的某些内容或计算结果时,您可以去做或做。这是最简单的编程,最容易测试和调试,但性能最差。只要这方面不是瓶颈,这很好;
  2. 懒惰。一旦完成特定的读取或计算,请不要再做一段时间,可能是从几毫秒到永久。这会给您的程序增加很多复杂性,但如果读取或计算费用昂贵,可以获得巨大的收益;和
  3. 过度渴望。这很像前两者的组合。结果是缓存的,但不是进行读取或计算或请求,而是有一定数量的抢先活动来预测您可能想要的内容。就像你从一个文件中读取10K一样,你很可能以后想要下一个10K块。而不是延迟执行,只是在它被请求的情况下得到它。
  4. 从中得到的教训是唐纳德·克努特(Donald Knuth)引用的“有些过度使用且经常引用错误”的说法,“过早优化是所有邪恶的根源”。渴望和过度渴望的解决方案增加了大量的复杂性,因此没有必要为那些不会产生有用益处的东西做这些。

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

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

答案 1 :(得分:2)

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

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

然而,XML是一种用于快速数据访问的糟糕格式。您需要浏览一堆可变长度的标签和属性才能获取数据,并且您将无法立即从一个记录跳转到下一个记录。除非您将文件解析为如上所述的数据结构。在这种情况下,你会有一些非常像RDMS的东西,所以你去。