【发布时间】:2013-11-13 15:04:50
【问题描述】:
我正在尝试尽快将CSV 文件的单个列读取到R。我希望将标准方法减少 10 倍的将列放入 RAM 所需的时间。
我的动机是什么?我有两个文件;一个叫Main.csv,它是300000行500列,一个叫Second.csv,它是300000行5列。如果我system.time() 命令read.csv("Second.csv"),则需要2.2 秒。现在,如果我使用以下两种方法中的任何一种来读取Main.csv 的第一列(这是Second.csv 的20%,因为它是1 列而不是5 列),它将花费40 多秒。 这与读取整个 600 MB 文件所需的时间相同——显然是不可接受的。
-
方法一
colClasses <- rep('NULL',500) colClasses[1] <- NA system.time( read.csv("Main.csv",colClasses=colClasses) ) # 40+ seconds, unacceptable -
方法二
read.table(pipe("cut -f1 Main.csv")) #40+ seconds, unacceptable
如何减少这个时间?我希望有一个R 解决方案。
【问题讨论】:
-
您可以将数据加载到数据库中并仅选择所需的列或使用 HDF5 文件而不是 csv。
-
@zero323 我需要一些可以是
io的东西:Python、Java、R。 -
require(data.table); fread( "path/to/file/Main.csv" )将立即提高您的速度。 -
我的old POC package 在这里可能会很有趣,它提供了一种以特殊二进制格式编写
data.frame的方法,以后可以用于一次仅读取几个变量。基本上它是save/readRDS的包装器,并将列写入单独的文件等。更多详细信息:stackoverflow.com/questions/4756989/… -
你的 csv 文件真的是逗号分隔的吗?我认为
scan(pipe("cut -f1 -d, Main.csv"))可能值得一试。
标签: r performance optimization csv io