将大型 .txt 文件(7.7 GB)读入 R 的包建议

3
我在尝试将一个大的 .txt 文件(7.7 GB)读入 R 时遇到了问题。该文件包含 817426 列和超过 1000 行,所有变量都是数值型。 我已经尝试使用不同的软件包(data.table、vroom、bigreadr),分别使用 fread、vroom 和 big_fread2 命令。
使用 fread 命令,我已经能够将前 145 行读入我的 R 会话中,但一旦我尝试读取第 146 行,它就会崩溃。对于其他命令,系统只是在一段时间后中止,错误消息为:
R 会话中止。R 遇到致命错误。会话被终止了。
这些是我迄今为止使用的代码:
system.time(dfUga <- fread("CpG_sexageres.txt", nrows=145, header = TRUE, sep = "\t", colClasses="numeric"))
system.time(dfUga <- vroom("CpG_sexageres.txt", col_names = TRUE))
system.time(dfUga <- big_fread2("CpG_sexageres.txt"))

任何建议都非常感激。干杯!

4
你有多少内存? - Lokesh
1
我很惊讶vroom没起作用。它应该懒惰地读取数据,也就是说不会一次性将所有内容放入内存中。 - David Arenburg
我有16GB的RAM。 - ACZ
1个回答

5

R主要在内存中运行。这意味着,如果从CSV读取的数据框的大小超过了可用的RAM,尝试读取它将会使R崩溃。在这里,一个选择是使用更适合托管这样大的数据集的工具。数据库是一个选项。您可以将数据加载到数据库中,然后使用适当的包从R访问它。

如果您确实需要使用整个数据集,那么大多数关系型数据库可能都可以使用。例如,MySQL是一个选项,并且有一个RMySQL包可以与MySQL数据库进行交互。

但是,您甚至可能不需要一次性使用整个数据集。如果您计划对数据集进行一些统计计算,并且在CSV文件中存在与行号相关的均匀或随机分布的数据,则可以只将该数据的子集读入R。这是一种方法从输入文件中抽样每N行。以您的7.7GB文件为例,如果您只读取每10行,您将得到一个770MB的数据框(大约),这应该远远低于您的R安装的内存限制。


我想那可能是一个选项。你会推荐哪种数据库和R包来访问它? - ACZ
@ACZ 我已经更新了我的答案,并提供了更多信息,希望能对你有所帮助。 - Tim Biegeleisen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接