r语言如何处理一个50GB的大csv文件?

How to deal with a 50GB large csv file in r language?

我在"large data process" in r 比较新,希望能得到一些关于如何处理50 GB csv 文件的建议。当前问题如下:

Table 看起来像:

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

通过在线搜索,我发现了几个不适合我的情况的答案,而且我真的无法理解如何将 "character" 转换为 "factor" 类型。

然后我尝试使用read.table.ffdf,这更糟。我找不到那方面的可靠指南。

(2) 使用 R 的 readline:

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

(3) 使用 SQL:

我不知道如何将文件转换成SQL版本,以及如何处理,如果有好的指南我想试试。但总的来说,我想坚持使用 R。

感谢您的回复和帮助!

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

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

或者,您可以就地处理文本文件。 awk、grep 和 perl 等命令行工具非常适合这项任务。我建议一次性使用这种方法。如果您想保留数据用于分析目的,我会推荐一个数据库。

您可以在带有 sqldf 包的幕后将 R 与 SQLite 一起使用。您将使用 sqldf 包中的 read.csv.sql 函数,然后您可以查询数据,但是您想要获得较小的数据框。

文档中的示例:

library(sqldf)

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

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