如何使用r语言处理50GB大型csv文件?

时间:2016-09-24 17:13:17

标签: sql r csv ff

我在这里的“大数据流程”相对较新,希望能找到一些关于如何处理50 GB csv文件的建议。目前的问题如下:

表格如下:

ID,Address,City,States,... (50 more fields of characteristics of a house)
1,1,1st street,Chicago,IL,...
# the first 1 is caused by write.csv, they created an index raw in the file

我想找到属于加利福尼亚州旧金山的所有行。它应该是一个简单的问题,但csv太大了。

我知道我有两种方法在R中使用它,另一种方法是使用数据库来处理它:

(1)使用R的ffdf包:

自上次保存文件以来,它使用的是write.csv,它包含所有不同的类型。

all <- read.csv.ffdf(
  file="<path of large file>", 
  sep = ",",
  header=TRUE, 
  VERBOSE=TRUE, 
  first.rows=10000, 
  next.rows=50000,
  )

控制台给了我这个:

Error in ff(initdata = initdata, length = length, levels = levels, ordered = ordered,  
: vmode 'character' not implemented

通过在线搜索,我找到了几个不适合我的案例的答案,而且我无法理解如何将“字符”转换为他们提到的“因素”类型。

然后我尝试使用read.table.ffdf,这更是灾难。我无法为那个找到一个可靠的指南。

(2)使用R的readline:

我知道这是另一种好方法,但找不到有效的方法来做到这一点。

(3)使用SQL:

我不知道如何将文件传输到SQL版本,以及如何处理这个,如果有一个很好的指南我想尝试。但总的来说,我想坚持使用R.

感谢您的回复和帮助!

2 个答案:

答案 0 :(得分:9)

你可以在幕后使用带有SQLite的R和sqldf包。您可以使用read.csv.sql包中的sqldf函数,然后可以查询数据,但是要获取较小的数据框。

文档中的示例:

library(sqldf)

iris2 <- read.csv.sql("iris.csv", 
    sql = "select * from file where Species = 'setosa' ")

我在非常大的CSV文件上使用了这个库,效果很好。

答案 1 :(得分:4)

评论太长了。

R - 在其基本配置中 - 将数据加载到内存中。记忆很便宜。 50 GB仍然不是典型的配置(您需要更多的数据来加载和存储数据)。如果你真的很擅长R,你或许可以找到另一种机制。如果您可以访问群集,则可以使用某些并行版本的R或Spark。

您还可以将数据加载到数据库中。对于手头的任务,数据库非常适合于该问题。 R可以轻松连接到几乎任何数据库。而且,您可能会发现一个对您想要做的事情非常有用的数据库。

或者,您可以只处理文本文件 in situ 。命令行工具(如awk,grep和perl)非常适合此任务。我会推荐这种方法进行一次性的努力。如果你想保留数据用于分析目的,我会推荐一个数据库。