Rust 处理大文件时生锈内核转储(70GB x 4)

Rust 处理大文件时生锈内核转储(70GB x 4),rust,Rust,当我试图将一个大文件(大约70GB)保存在Rust中时,它会导致内核转储并停止该过程。起初我认为这可能是因为缺少存储空间,所以我进行了调查,但事实并非如此。 下面是我如何得到错误的 memory allocation of 73603432908 bytes failed /var/spool/uge/at163/job_scripts/12220153: line 8: 46483 Aborted 我用的是 $ rustup --version rustup 1.23.1 (3df2264a

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

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存储数据。代码如下

使用ndarray//0.14.0
使用ndarray::Array3;
使用ndarray\u npy::write\u npy//0.7.1
结构特征{
输入_o:Array3,//70GB
输入_c:Array3,//70GB
输入_ca:Array3,//70GB
输入\u n:Array3,//70GB
目标:阵列3,
目标c:阵列3,
目标:阵列3,
目标:阵列3,
}
fn main(){
//做点什么
书写(
&(dir.to_string()+&fname+“_input_C.npy”),
&features.input_c,
)
.unwrap();
书写(
&(dir.to_string()+&fname+“_input_CA.npy”),
&features.input_ca,
)
.unwrap();
书写(
&(dir.to_string()+&fname+“_input\u N.npy”),
&功能。输入,
)
.unwrap();
书写(
&(dir.to_string()+&fname+“_input_O.npy”),
&features.input_o,
)
.unwrap();
书写(
&(dir.to_string()+&fname+“_target_C.npy”),
&特点.目标(c),
)
.unwrap();
书写(
&(dir.to_string()+&fname+“_target_CA.npy”),
&features.target_ca,
)
.unwrap();
书写(
&(dir.to_string()+&fname+“_target\u N.npy”),
&特点。目标,
)
.unwrap();
书写(
&(dir.to_string()+&fname+“_target_O.npy”),
&功能。目标,
)
.unwrap();
}


除非您的计算机的RAM超过280GB,否则您将无法访问序列化部分,并且在尝试保留其中一个阵列所需的内存时会发生分配错误。如果您试图处理存储在磁盘上的数据,可以签出板条箱将其保存在磁盘上,但将其视为内存中的数据。

除非您的计算机具有超过280GB的RAM,否则您将无法访问序列化部分,并且在尝试保留其中一个阵列所需的内存时会发生分配错误。如果您试图处理存储在磁盘上的数据,您可以检查板条箱以将其保存在磁盘上,但将其视为内存中的数据。

错误似乎相对明显:有人试图分配一个与整个数据大小相同的缓冲区,而这会导致崩溃,因为在大多数系统上尝试提交73GB有点太多。您应该进行一些调试以跟踪失败的确切位,然后修复代码或将问题报告给您正在调用的任何库(可能是在检查是否有其他API可以代替它工作之后)。在尝试保存数据时会出现这种情况似乎有些奇怪,但我认为在内存中加载数据时会出现这种问题。您能演示一下如何将数据写入文件吗?在写入磁盘之前,您似乎试图将其全部存储在例如
Vec
中。@sebpuetz谢谢您的评论!!我更新了如何保存数据。@Masklin谢谢你的提醒!从我编写的代码日志中可以看出,我在保存数据的阶段收到了一个错误。@Bokutotsuchus我认为这样做不会有多大帮助,您可能会得到更多的帮助,向ndarray_npy的维护人员报告此问题,并查看他们是否有调试建议,或者您可以使用较低级别的方法来避免分配。运行堆分析之类的东西(也可能会有帮助。错误似乎比较明显:有人试图分配一个与整个系统大小相同的缓冲区,这会导致崩溃,因为在大多数系统上尝试提交73GB有点太多。您应该进行一些调试以跟踪失败的确切位,然后修复代码或将问题报告给您正在调用的任何库(可能,在检查是否有其他API可以替代后)。在尝试保存数据时出现这种情况似乎很奇怪,但我希望在将数据加载到内存时会出现这种问题。您能演示一下如何将数据写入文件吗?似乎您正在尝试在写入磁盘之前将其全部存储在例如
Vec
中。@sebpuetz谢谢您的评论!!我更新了如何保存数据@Masklin感谢您的回复!从我编写的代码日志中可以看出,我在保存数据的阶段收到了一个错误。@Bokutotszuchus我认为这样做不会有多大帮助,您可能会得到更多的帮助,将此问题报告给ndarray\u npy的维护人员,看看他们是否有调试或维护的建议您可以使用较低级别的方法来避免分配(可能也会有帮助。谢谢你写下答案。我也用512GB运行了内存请求,起初认为内存不足,进程失败,但我得到了相同的结果。我会按照你的建议尝试使用memmap重写它。如果你有512GB的物理RAM,那就很奇怪了。也许你有非无限
u限制RSS和/或VSS上的
s?@masklin感谢您的评论!ulimit是一个squid。这可能不是问题。数据段大小(KB,-d)无限制调度优先级(-e)0文件大小(块,-f)无限制最大锁定内存(KB,-l)无限制最大内存大小(KB,-m)无限打开文件(-n)131072管道大小(512字节,-p)8 POSIX消息队列(字节,-q)819200堆栈大小(kbytes,-s)无限虚拟内存(kbytes,-v)4194304文件锁(-x)无限感谢您写入答案。我还运行了内存请求