将大文件读入R

4
我是一名R语言的新手,但我知道它对于“大”文件处理不太好。我正在尝试读取一个200MB的数据文件,无论是csv格式还是转换为制表符分隔的txt格式,都会在文件加载前使用完我的4GB内存。
R使用4GB内存来加载200MB文件,这是正常的吗?还是文件出了问题,导致R除了数据以外还在读取一堆无用信息?

6
  1. 200MB远远不算"大"。
  2. 你使用的是哪个函数来读取文件的(并且你有没有阅读该函数的帮助页面)?
  3. 文件中包含什么类型的数据?
  4. 你在SO上搜索过吗?(我通过搜索"[r] large file"找到了几个相关的问题/答案)
  5. 你有没有阅读《R数据导入/导出》(http://cran.r-project.org/doc/manuals/R-data.html)?
- Joshua Ulrich
1
请提供一个可复现的代码片段来展示你的问题。一个200 MB的CSV文件通常不应该占用4 GB的空间。 - Paul Hiemstra
我尝试使用基本的方法来读取文件,因为这是我所知道的:read.table("myfile.csv", header=TRUE) 或者对于txt版本,我使用了read.table("myfile.txt", sep = "\t", header=TRUE)。有200多列,其中大部分都是单个字母或小数字。不幸的是,在中间有一大组变量是稀疏的。 - Oliver
变量名的长度是否会影响程序运行?有些变量名非常长,我猜他们认为这样很具描述性。 - Oliver
@Oliver 如果你对于read.table/scan等R函数读写数据不熟悉,我认为你应该先花时间在小文件上进行测试,一旦你理解了基础知识,再尝试读取你的“巨大”文件。 - agstudy
1个回答

11

?read.table

Less memory will be used if colClasses is specified as one of the six atomic vector classes.
非常感谢您的信任和选择。以下是您需要翻译的内容:

这个新产品具有卓越的性能和高度的可靠性,可以提高工作效率并节省时间和成本。

Using nrows, even as a mild over-estimate, will help memory usage.

请同时使用这两个参数。

确保您正确地为数字数据指定numeric。请参见此处:在read.csv中指定colClasses

不要低估nrows参数。

如果您运行的是64位R,请尝试使用32位版本。它将使用更少的内存来存储相同的数据。

也可以参考此处:扩展R的内存大小限制


4
为什么你提到了 nrows,但没有提到 colClasses?将数字存储为字符串非常低效,并且调用 type.convert 会导致不必要的重复。你怎么知道 read.table 是最好的函数呢?原帖作者甚至没有告诉你他们的数据是什么样子的(例如,如果它只是一个矩阵,scan 可能是更好的解决方案)。 - Joshua Ulrich
@Oliver 确定您的列类(请参见链接的问题)并包括该参数。如果这样做不起作用,还可以使用 nrows。制表符和逗号分隔值之间的区别并不重要。 - Matthew Lundberg
谢谢,我会查看nrows和colClasses。 - Oliver

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