gpt4 book ai didi

r - 使用 write.csv 时出现内存错误

转载 作者:行者123 更新时间:2023-12-01 18:55:51 26 4
gpt4 key购买 nike

我有一个 9 列的 data.frame (x),它有数百万行。我能够将其读入 R,成功地对其进行一些修改,并且代码可以毫无问题地执行。但是,当我尝试使用

将其写入 .csv 文件时
write.csv(x,file=argv[2],quote=F,row.names=F)

我收到一条错误消息

Error: cannot allocate vector of size 1.2Gb

这毫无意义,因为数据已经在内存中,计算已完成,而我想做的就是将其写到磁盘上。此外,当我监视内存时,在此写入阶段,该进程的虚拟内存大小几乎增加了一倍。编写自定义 C 函数来写出此 data.frame 有帮助吗?任何建议/帮助/指示表示赞赏。

ps:我在一个大约 24G RAM 的 64 位 ubuntu 机器上运行所有这些。整体空间可能不是问题。数据大小约10G

最佳答案

您必须了解,R 函数如果修改参数,通常会复制参数,因为 R 使用的函数式编程范式规定函数不会更改作为参数传入的对象;因此,当在执行函数的过程中需要进行更改时,R 会复制它们。

如果您构建具有内存跟踪支持的 R,您可以看到针对您遇到问题的任何操作的复制操作。使用 airquality 示例数据集,跟踪我看到的内存使用情况

> head(airquality)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> tracemem(airquality)
[1] "<0x12b4f78>"
> write.csv(airquality, "airquality.csv")
tracemem[0x12b4f78 -> 0x1aac0d8]: as.list.data.frame as.list lapply unlist which write.table eval eval eval.parent write.csv
tracemem[0x12b4f78 -> 0x1aabf20]: as.list.data.frame as.list lapply sapply write.table eval eval eval.parent write.csv
tracemem[0x12b4f78 -> 0xf8ae08]: as.list.data.frame as.list lapply write.table eval eval eval.parent write.csv
tracemem[0x12b4f78 -> 0xf8aca8]: write.table eval eval eval.parent write.csv
tracemem[0xf8aca8 -> 0xca7fe0]: [<-.data.frame [<- write.table eval eval eval.parent write.csv
tracemem[0xca7fe0 -> 0xcaac50]: [<-.data.frame [<- write.table eval eval eval.parent write.csv

这表明当 R 准备将数据写入文件时,正在制作 6 个数据副本。

显然,这会耗尽您可用的 24Gb RAM;该错误表明 R 需要另外 1.2Gb RAM 才能完成操作。

最简单的开始解决方案是以 block 的形式写入文件。使用 append = FALSE 写出第一组数据行,然后使用 append = TRUE 进行后续调用 write.csv() 写入取出剩余的 block 。您可能需要尝试一下以找到不会超过可用内存的 block 大小。

关于r - 使用 write.csv 时出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10768834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com