我有非常大的表(3000万行),我想加载为R中的数据帧 read.table()有很多方便的功能,但似乎实现中有很多逻辑会减慢速度.在我的情况下,我假设我提前知道列的类型,表不包含任何列标题或行名称,并且没有任何我必须担心的病态字符.
我知道在表格中阅读作为列表使用scan()可能非常快,例如:
datalist <- scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0)))
Run Code Online (Sandbox Code Playgroud)
但是我将此转换为数据帧的一些尝试似乎将上述性能降低了6倍:
df <- as.data.frame(scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0))))
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?或者很可能完全不同的方法来解决问题?
我有一个data.frame,我想写出来.我的尺寸data.frame是256行乘65536列.什么是更快的替代品write.csv?
我已经检查了几个相关的问题,比如这个
我引用了最受好评的答案的特定部分
这取决于您想要做什么以及如何进一步处理数据.在任何情况下,只要您始终需要相同的数据集,从二进制R对象加载总是会更快.在这里极限速度是你的硬盘,而不是R的速度.二进制形式是工作空间中数据框的内部表示,因此不再需要转换
我真的这么认为.但是,生活就是在试验.我有一个包含igraph对象的1.22 GB文件.这就是说,我不认为我在这里找到的与对象类有关,主要是因为你甚至可以在调用"library"之前加载('file.RData').
这台服务器中的磁盘非常酷.因为你可以检查内存的阅读时间
user@machine data$ pv mygraph.RData > /dev/null
1.22GB 0:00:03 [ 384MB/s] [==================================>] 100% `
Run Code Online (Sandbox Code Playgroud)
但是,当我从R加载此数据时
>system.time(load('mygraph.RData'))
user system elapsed
178.533 16.490 202.662
Run Code Online (Sandbox Code Playgroud)
所以看起来加载*.RData文件比磁盘限制慢60倍,这应该意味着R实际上在"加载"时做了一些事情.
我有同样的感觉使用不同的R版本与不同的硬件,这只是这次我耐心做基准测试(主要是因为有这么酷的磁盘存储,负载实际需要多长时间是可怕的)
关于如何克服这个问题的任何想法?
经过回答的想法
save(g,file="test.RData",compress=F)
Run Code Online (Sandbox Code Playgroud)
现在该文件为3.1GB,之前为1.22GB.在我的情况下,加载解压缩速度要快一点(磁盘远远不是我的瓶颈)
> system.time(load('test.RData'))
user system elapsed
126.254 2.701 128.974
Run Code Online (Sandbox Code Playgroud)
将未压缩文件读取到内存大约需要12秒,因此我确认大部分时间都用于设置环境
我将回到RDS结果,听起来很有趣
正如我所承诺的那样
system.time(saveRDS(g,file="test2.RData",compress=F))
user system elapsed
7.714 2.820 18.112
Run Code Online (Sandbox Code Playgroud)
我得到一个3.1GB就像"保存"未压缩,虽然md5sum是不同的,可能是因为save还存储了对象名称
现在看...
> system.time(a<-readRDS('test2.RData'))
user system elapsed
41.902 2.166 44.077
Run Code Online (Sandbox Code Playgroud)
因此,结合两种想法(解压缩和RDS)的速度提高了5倍.谢谢你的贡献!
我试图尽快读取CSV文件的单个列R.我希望在将列放入RAM 10倍的时间内减少标准方法.
我的动机是什么?我有两个文件; 一个称为Main.csv300000行和500列,一个称为Second.csv300000行和5列.如果我system.time()是命令read.csv("Second.csv"),则需要2.2秒.现在,如果我使用下面两种方法中的任何一种来读取第一列Main.csv(Second.csv因为它是1列而不是5列,它的大小是20%),它将花费超过40秒.这与读取整个600兆字节文件所用的时间相同 - 显然是不可接受的.
方法1
colClasses <- rep('NULL',500)
colClasses[1] <- NA
system.time(
read.csv("Main.csv",colClasses=colClasses)
) # 40+ seconds, unacceptable
Run Code Online (Sandbox Code Playgroud)方法2
read.table(pipe("cut -f1 Main.csv")) #40+ seconds, unacceptable
Run Code Online (Sandbox Code Playgroud)如何减少这个时间?我希望有一个R解决方案.
我有一个大数据集(大约 13GB 未压缩),我需要重复加载它。第一次加载(并保存为不同的格式)可能非常慢,但此后的每次加载都应尽可能快。加载数据集的最快方式和最快格式是什么?
我的怀疑是最佳选择是这样的
saveRDS(obj, file = 'bigdata.Rda', compress = FALSE)
obj <- loadRDS('bigdata.Rda)
Run Code Online (Sandbox Code Playgroud)
但这似乎比使用包中的fread函数慢data.table。这不应该是这种情况,因为fread从 CSV 转换文件(尽管它确实是高度优化的)。
大约 800MB 数据集的一些时间是:
> system.time(tmp <- fread("data.csv"))
Read 6135344 rows and 22 (of 22) columns from 0.795 GB file in 00:00:43
user system elapsed
36.94 0.44 42.71
saveRDS(tmp, file = 'tmp.Rda'))
> system.time(tmp <- readRDS('tmp.Rda'))
user system elapsed
69.96 2.02 84.04
Run Code Online (Sandbox Code Playgroud)
这个问题是相关的,但不反映 R 的当前状态,例如一个答案表明从二进制格式读取总是比文本格式快。使用 *SQL 的建议在我的情况下也没有帮助,因为需要整个数据集,而不仅仅是它的一个子集。
还有一些关于加载数据的最快方式的相关问题(例如:1)。
r ×5
io ×2
csv ×1
data.table ×1
dataframe ×1
fread ×1
import ×1
optimization ×1
performance ×1
r-faq ×1
read.table ×1