对大文件执行 FFT 的最快方法是啥?
Posted
技术标签:
【中文标题】对大文件执行 FFT 的最快方法是啥?【英文标题】:What is the fastest way to perform FFT on a large file?对大文件执行 FFT 的最快方法是什么? 【发布时间】:2019-01-15 06:51:23 【问题描述】:我正在开发一个需要对大型 2D 栅格数据(10 到 100 GB)执行 FFT 的 C++ 项目。特别是在对每列应用 FFT 时性能非常糟糕,因为其元素在内存中不连续(以数据宽度的步幅放置)。
目前,我正在这样做。由于数据不适合内存,我读取了几列,即n
列,并将其方向转置到内存中(以便文件中的列变成内存中的一行)并使用外部库应用 FFT (MKL)。我阅读 (fread
) n
像素,移动到下一行(fseek
和 width - n
一样多),阅读 n
像素,跳到下一行,等等。当对列块完成操作(FFT)时,我以相同的方式将其写回文件。我写n
像素,跳到下一行,依此类推。这种读写文件的方式太费时间了,所以想找个办法来提升一下。
我事先考虑过转置整个文件,但整个过程包括行优先和列优先的 FFT 操作,转置不会受益。
我想听听有关对大数据进行这种以列为主的操作的任何经验或想法。任何与 FFT 或 MKL 相关的建议也会有所帮助。
【问题讨论】:
你试过memory-mapped files吗? 100GB 数据集在当代标准中并不“大”。例如,AWS 上的x1.16xlarge
实例有 1TB 的 RAM,可以以每小时 2 美元的现货价格租用。如果您每天只处理几个数据集并且可以将数据存储在云中(例如 AWS S3),那么按需雇用必要的计算能力可能更值得。
@oakad:当您按小时付费时,消除不必要的减速尤为重要。这个问题与 AWS 应用程序同样重要。
您是否为n
使用了合理的值?我希望4096/sizeof(pixel)
的值可以正常工作。当然,这类代码应该在快速 SSD 上运行;我同意 Oakad 使用快速硬件的一般想法。在 SSD 上,4K 随机读取应该很快。
@MSalters 不,问题是关于 FFT 处理不直接适合 RAM 的“慢”存储数据。我的评论是关于租用足够的 RAM 而不是为“慢”存储而烦恼。
【参考方案1】:
为什么不同时处理转置数据和非转置数据?这将增加 x2 的内存需求,但这可能是值得的。
【讨论】:
【参考方案2】:考虑切换到 Hadamard 变换。作为一个完整的 IPS,变换不提供乘法,因为变换中的所有系数都是正负一。如果您需要傅立叶基的结果变换,矩阵乘法将改变基数。
【讨论】:
以上是关于对大文件执行 FFT 的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在实时网页上执行 JavaScript 文件最快、最简单的方法是啥?