使用 numpy/h5py 的高效内存 Benjamini-Hochberg FDR 校正

Memory-efficient Benjamini-Hochberg FDR correction using numpy/h5py

我正在尝试使用 Benjamini & Hochberg 的方法计算一组经过 FDR 校正的 p 值。但是,我尝试 运行 这个矢量包含超过 100 亿个值。

给定数据量,正常 method from statsmodel's multicomp 模块很快 运行s 内存不足。查看该函数的源代码,它似乎在内存中创建了多个长度为 100 亿的向量,这显然是行不通的,即使在具有 100GB RAM 的机器上也是如此。

有没有办法做到这一点,理想情况下不必将整个向量保存在内存中?特别是我想知道是否有可能以允许它 运行 使用 h5py 数据结构在磁盘上的方式重新实现 BH。

或任何其他建议?

以防其他人偶然发现:

我解决这个问题的方法是首先提取所有有可能超过 FDR 校正阈值的 p 值(我使用 1e-5)。内存消耗不是问题,因为我可以遍历磁盘上的 p 值列表。

这给了我一组约 400k 的最低 p 值。然后我手动将 BH 过程应用于这些 p 值,但将原始测试数插入到公式中。由于 BH 是一个升压过程,这(据我所知)相当于将 BH 应用于整个向量,而不需要我对 100 亿个值进行排序。