gpt4 book ai didi

r - 分段读取 CSV 文件的策略?

转载 作者:行者123 更新时间:2023-12-02 03:56:22 28 4
gpt4 key购买 nike

我的计算机上有一个中等大小的文件 (4GB CSV),但没有足够的 RAM 来读取该文件(64 位 Windows 上为 8GB)。在过去,我只是将其加载到集群节点上并读入,但我的新集群似乎任意将进程限制为 4GB RAM(尽管每台机器的硬件有 16GB),所以我需要一个短期修复.

有没有办法将 CSV 文件的一部分读入 R 以适应可用内存限制?这样我就可以一次读取文件的三分之一,将其子集化为我需要的行和列,然后读取下一个三分之一?

感谢评论者指出我可以使用一些大的内存技巧来读取整个文件: Quickly reading very large tables as dataframes in R

我可以想到一些其他解决方法(例如,在一个好的文本编辑器中打开,删除 2/3 的观察结果,然后加载到 R 中),但如果可能的话,我宁愿避免它们。

因此,分段阅读似乎仍然是目前最好的方法。

最佳答案

查看此线程后,我注意到没有提到此问题的明显解决方案。使用连接!

1) 打开与您的文件的连接

con = file("file.csv", "r")

2) 使用 read.csv 读取代码块

read.csv(con, nrows="CHUNK SIZE",...)

旁注:定义 colClasses 将大大加快速度。确保将不需要的列定义为 NULL。

3)做你需要做的事情

4)重复。

5)关闭连接

close(con)

这种方法的优点是连接。如果省略此步骤,可能会减慢速度。通过手动打开连接,您实际上打开了数据集,并且在调用 close 函数之前不会将其关闭。这意味着当您循环访问数据集时,您将永远不会失去您的位置。假设您有一个包含 1e7 行的数据集。另请想象您想要一次加载 1e5 行的 block 。由于我们打开连接,我们通过运行 read.csv(con, nrow=1e5,...) 获取前 1e5 行,然后为了获取第二个 block ,我们运行 read.csv(con, nrow=1e5,...)还有,等等......

如果我们不使用连接,我们将以相同的方式获得第一个 block ,read.csv("file.csv", nrow=1e5,...) ,但是对于下一个 block ,我们需要 read.csv("file.csv", skip = 1e5, nrow=2e5,...) 。显然这是低效的。尽管我们刚刚读取了 1e5 行,但我们必须重新找到 1e5+1 行。

最后,data.table::fread是很棒的。但你不能通过它连接。所以这个方法行不通。

我希望这对某人有帮助。

更新

人们不断对这篇文章进行投票,所以我想我应该再补充一个简短的想法。新readr::read_csv ,例如read.csv ,可以通过连接。然而,它是advertised大约快 10 倍。

关于r - 分段读取 CSV 文件的策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9352887/

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