【问题标题】:Rust core dump when handling big files(70GB x 4)处理大文件时的 Rust 核心转储(70GB x 4)
【发布时间】:2021-06-16 15:14:36
【问题描述】:

当我尝试在 Rust 中保存一个大(大约 70GB)文件时,它会导致核心转储并停止该进程。起初我以为可能是存储空间不足,所以我调查了一下,但事实并非如此。 这是我得到的错误。

memory allocation of 73603432908 bytes failed
/var/spool/uge/at163/job_scripts/12220153: line 8: 46483 Aborted

我用的是

$ rustup --version
rustup 1.23.1 (3df2264a9 2020-11-30)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.50.0 (cb75ad5db 2021-02-10)`.
info: The currently active `rustc` version is `rustc 1.50.0 (cb75ad5db 2021-02-10)`.

此外,使用箱使用ndarray。 保存文件时,使用ndarray-npy.npy格式保存。

我解释了我如何使用 ndarray-npy 来存储我的数据。代码如下

use ndarray; //0.14.0
use ndarray::Array3;
use ndarray_npy::write_npy; //0.7.1


struct Features {
    input_o: Array3<f32>, // 70GB
    input_c: Array3<f32>, // 70GB
    input_ca: Array3<f32>, // 70GB
    input_n: Array3<f32>,  // 70GB
    target_o: Array3<f32>, 
    target_c: Array3<f32>,
    target_ca: Array3<f32>,
    target_n: Array3<f32>,
}

fn main() {
    // do something
    write_npy(
        &(dir.to_string() + &fname + "_input_C.npy"),
        &features.input_c,
    )
    .unwrap();
    write_npy(
        &(dir.to_string() + &fname + "_input_CA.npy"),
        &features.input_ca,
    )
    .unwrap();
    write_npy(
        &(dir.to_string() + &fname + "_input_N.npy"),
        &features.input_n,
    )
    .unwrap();
    write_npy(
        &(dir.to_string() + &fname + "_input_O.npy"),
        &features.input_o,
    )
    .unwrap();

    write_npy(
        &(dir.to_string() + &fname + "_target_C.npy"),
        &features.target_c,
    )
    .unwrap();
    write_npy(
        &(dir.to_string() + &fname + "_target_CA.npy"),
        &features.target_ca,
    )
    .unwrap();
    write_npy(
        &(dir.to_string() + &fname + "_target_N.npy"),
        &features.target_n,
    )
    .unwrap();
    write_npy(
        &(dir.to_string() + &fname + "_target_O.npy"),
        &features.target_o,
    )
    .unwrap();

}


【问题讨论】:

  • 这个错误似乎比较清楚:有些东西试图分配一个与整个东西大小相同的缓冲区,但由于尝试提交 73GB 在大多数系统上有点多,所以这会爆炸。您应该进行一些调试以跟踪失败的确切位,然后修复您的代码或将问题报告给您正在调用的任何库(可能在检查是否有其他 API 可以代替之后)。尝试 save 数据时会发生这种情况似乎很奇怪,但我希望将数据加载到内存中时会出现此问题。
  • 你能说明你是如何将数据写入文件的吗?看起来您正试图将其全部存储在例如写入磁盘之前的Vec
  • @sebpuetz 谢谢你的评论!!我更新了如何保存数据。
  • @Masklinn 感谢您的评论!从我写的代码的日志中可以看出,我在保存数据的阶段收到了一个错误。
  • @BoKuToTsuZenU 我认为 SO 不会有太大帮助,您可能会得到更多帮助,将这个问题报告给 ndarray_npy 的维护者,看看他们是否有调试建议或更低 -您可以使用可以避免分配的级别方法。运行诸如堆分析之类的东西(see here 也可能有帮助。

标签: rust


【解决方案1】:

除非您的机器有超过 280GB 的 RAM,否则您将无法进入序列化部分,并且在尝试保留其中一个阵列所需的内存时会发生分配错误。如果您尝试使用存储在磁盘上的数据,您可以查看 memmap crate 以将其保留在磁盘上,但将其视为在内存中。

【讨论】:

  • 感谢您写下答案。我也用 512GB 运行内存请求,一开始以为内存不足,进程失败,但得到了相同的结果。我将尝试按照您的建议使用 memmap 重写它。
  • 如果你有 512GB 的物理内存,那就有点奇怪了。也许您的 RSS 和/或 VSS 上有无限的ulimits?
  • @Masklinn 感谢您的评论! ulimit 是鱿鱼。这可能不是问题。数据段大小 (kbytes, -d) 无限调度优先级 (-e) 0 文件大小 (blocks, -f) 无限最大锁定内存 (kbytes, -l) 无限最大内存大小 (kbytes, -m) 无限打开文件 (- n) 131072 管道大小 (512 bytes, -p) 8 POSIX 消息队列 (bytes, -q) 819200 堆栈大小 (kbytes, -s) 无限虚拟内存 (kbytes, -v) 4194304 文件锁 (-x) 无限跨度>
猜你喜欢
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
相关资源
最近更新 更多