R中无法加载的CSV文件过大?

5

我有一个3GB大小的csv文件。这个文件太大了,无法在我的电脑上加载到R中。相反,我想要只加载部分行(比如说1000行),而不是整个数据集。

这种操作是否可行呢?我在任何地方都找不到答案。


6
请参考sqldf主页上的例子6e,链接为http://sqldf.googlecode.com,可以得到一个简单明了的一行代码解决方案。 - G. Grothendieck
@G.Grothendieck:从我的任务管理器来看,整个文件已经加载到了内存中。 - Raffael
是的,我一直在思考它如何在R中工作。我的想法是告诉R选择性地读取CSV文件的某些行。 - Anton
请看这里(从一个大文本文件中取样):https://dev59.com/92Up5IYBdhLWcg3wF0Zq - Ido Tamir
1
@Яaffaelless,sqldf默认使用RAM,但使用参数dbname = tempfile(),它将设置、使用和销毁一个临时数据库,只有抽样行才会被读入R。 - G. Grothendieck
@G.Grothendieck:刚看到你是sqldf的维护者 - 很棒的包!我一直在使用它。 - Raffael
1个回答

7

如果您不想花费成千上万的美元去使用Revolution R来一次性加载/分析您的数据,那么迟早需要找到一种方法对数据进行采样。

而这一步骤在R之外更容易实现。

(1) Linux Shell:

假设您的数据格式一致,每行是一个记录。您可以执行以下操作:

sort -R data | head -n 1000 >data.sample

这将随机排序所有行并将前1000行放入一个单独的文件data.sample。
(2) 如果数据太大,无法全部存储在内存中。
还有一种解决方案是使用数据库来存储数据。例如,我有许多以美观的表格形式存储在MySQL数据库中的表格。可以通过以下方式进行抽样:
select * from tablename order by rand() limit 1000

你可以使用RMySQL轻松实现MySQL与R之间的通信,并且可以对列进行索引以保证查询速度。如果需要考虑数据库的性能,你还可以验证整个数据集的均值或标准差与样本的差异。根据我的经验,这是处理“大”数据最常用的两种方法。

整体想法不错,但是我不知道你使用的sort版本是否有 -R 选项。 - flodel
@flodel https://dev59.com/OHNA5IYBdhLWcg3wn_fD@flodel https://dev59.com/OHNA5IYBdhLWcg3wn_fD - B.Mr.W.
我知道这不是R代码,我指的是这个链接:http://linux.about.com/library/cmd/blcmdl1_sort.htm,它没有-R选项。但是@B.Mr.W.提供的链接有各种选项,适用于不同的操作系统。 - flodel

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