如何处理 r 语言的 50GB 大 csv 文件?
Posted
技术标签:
【中文标题】如何处理 r 语言的 50GB 大 csv 文件?【英文标题】:How to deal with a 50GB large csv file in r language? 【发布时间】:2017-02-02 09:16:42 【问题描述】:我在r中的“大数据处理”中比较新,希望寻找一些关于如何处理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。
感谢您的回复和帮助!
【问题讨论】:
看看this answer是否有帮助。 in v. 类似于 ^^ 链接***.com/questions/26861951/… 我会检查一下谢谢! How do i read only lines that fulfil a condition from a csv into R?的可能重复 【参考方案1】:您可以通过 sqldf 包在幕后使用 R 和 SQLite。您可以使用sqldf
包中的read.csv.sql
函数,然后您可以查询数据,但是您想获得更小的数据框。
文档中的示例:
library(sqldf)
iris2 <- read.csv.sql("iris.csv",
sql = "select * from file where Species = 'setosa' ")
我在非常大的 CSV 文件上使用了这个库,效果很好。
【讨论】:
谢谢 我去看看!我目前遇到的问题还涉及大数据文件中的额外索引列,read.csv.sql 可以处理吗? :D 我目前遇到的问题还涉及大数据文件中的额外索引列,有什么办法可以解决吗?现在它告诉我,如果从第二行开始,它比第一行多 1 个字段.. @windsound 我不确定我是否完全遵循,但听起来您的 CSV 文件可能没有每条记录具有一致数量或列的记录。您必须对数据进行试验。您可能想要删除该问题行,但如果您的 CSV 数据没有被引用,并且您的地址数据或其他字段中有逗号,您将继续遇到问题,并且可能需要重新生成您的数据,并使用引用的字段。希望有帮助。在 read.csv.sql 函数中有一个报价参数,您可以将其设置为 T/F - 取决于您的数据。祝你好运! 伙计,不知道怎么回事,但我有一个制表符分隔的 csv,我试图读取单列和 2% 的行,这需要很长时间。完整文件为 176M 行。这只是条件反射吗?它比阅读整个内容要慢...【参考方案2】:R——在其基本配置中——将数据加载到内存中。内存很便宜。 50 GB 仍然不是典型的配置(您需要更多的数据来加载和存储数据)。如果你真的很擅长 R,你可能会想出另一种机制。如果您有权访问集群,则可以使用 R 或 Spark 的一些并行版本。
您也可以将数据加载到数据库中。对于手头的任务,数据库非常适合该问题。 R 可以轻松连接到几乎任何数据库。而且,您可能会发现数据库对您想做的事情非常有用。
或者,您可以在原地处理文本文件。 awk、grep 和 perl 等命令行工具非常适合此任务。我建议一次性使用这种方法。如果您想保留数据以用于分析目的,我建议您使用数据库。
【讨论】:
我支持使用 awk 或 grep 的建议!对于这样的单个查询,您将在几分钟内完成。 @GordonLinoff,您对 R 和 Spark 的建议也很好。我已经在 AWS 上使用它来撕毁约 4TB 的二进制文件,并且它处理得很好! 我现在明白了,只是需要一段时间才能意识到它是数据库类型的东西,因为以前,R 可以很好地处理 10GB 数据表......非常感谢您的评论!readLines()
(逐行连接)+正则表达式函数(标准或stringi
)也可以正常工作,它可以将分析管道保留在 R 中并跨平台工作。 awk
(et al) 可能是 1GB Rtools.exe 下载的一部分,但 Windows R 用户往往在非 R 解决方案中遇到最多问题。以上是关于如何处理 r 语言的 50GB 大 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章
LiveGBS国标GB_T28181视频流媒体平台接入海康大华宇视监控摄像头硬件NVR通道0无法获取视频通道时候如何处理