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 文件上使用了这个库,并取得了很好的效果。
我在"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 文件上使用了这个库,并取得了很好的效果。