【发布时间】: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