简而言之,IMO的主要区别:
- 您应该事先知道您可能的瓶颈是什么(I/O 或 CPU),并专注于解决这个问题的最佳算法和基础设施。I/O 经常是瓶颈。
- 算法的选择和微调通常支配任何其他选择。
- 即使是对算法和访问模式的适度更改也会对性能产生数量级的影响。您将进行很多微优化。“最佳”解决方案将取决于系统。
- 与您的同事和其他科学家交谈,从他们使用这些数据集的经验中获益。很多技巧是教科书上找不到的。
- 预计算和存储可以非常成功。
带宽和 I/O
最初,带宽和 I/O 通常是瓶颈。给你一个观点:在SATA 3的理论极限下,读取 1 TB 大约需要 30 分钟。如果您需要随机访问、多次读取或写入,您希望大部分时间在内存中执行此操作,或者需要更快的东西(例如带有InfiniBand的iSCSI)。理想情况下,您的系统应该能够执行并行 I/O,以尽可能接近您使用的任何接口的理论极限。例如,简单地在不同的进程中并行访问不同的文件,或者在MPI-2 I/O之上的HDF5很常见。理想情况下,您还可以并行执行计算和 I/O,以便两者之一是“免费的”。
集群
根据您的情况,I/O 或 CPU 可能会成为瓶颈。无论是哪一种,如果您能够有效地分配任务(例如MapReduce),集群都可以实现巨大的性能提升。这可能需要与典型教科书示例完全不同的算法。在这里花费开发时间通常是最好的时间。
算法
在算法之间进行选择时,算法的大 O 非常重要,但是具有相似大 O 的算法在性能上可能会因局部性而有很大差异。算法的局部性越小(即缓存未命中和主存未命中越多),性能就越差 - 访问存储通常比主存慢一个数量级。改进的经典示例是矩阵乘法或循环交换的平铺。
计算机、语言、专业工具
如果您的瓶颈是 I/O,这意味着大型数据集的算法可以受益于更多的主内存(例如 64 位)或内存消耗更少的编程语言/数据结构(例如,在 Python 中__slots__
可能有用),因为更多的内存可能意味着每个 CPU 时间的 I/O 更少。顺便说一句,具有 TB 主存储器的系统并非闻所未闻(例如HP Superdomes)。
同样,如果您的瓶颈是 CPU,那么允许您使用架构的特殊功能(例如SIMD,如SSE)的更快的机器、语言和编译器可能会将性能提高一个数量级。
The way you find and access data, and store meta information can be very important for performance. You will often use flat files or domain-specific non-standard packages to store data (e.g. not a relational db directly) that enable you to access data more efficiently. For example, kdb+ is a specialized database for large time series, and ROOT uses a TTree
object to access data efficiently. The pyTables you mention would be another example.