对大文件执行 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 像素,移动到下一行(fseekwidth - 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 文件最快、最简单的方法是啥?

按列合并多个 csv 文件的最快方法是啥?

搜索硬盘中所有文件的最快方法是啥?

比较两个文本文件的最快方法是啥,而不是将移动的行计算为不同的

访问 zip 文件中文件的最快方法是啥?

使用 Matlab 对大数据 (16gB) 进行 FFT