相关疑难解决方法(0)

快速读取非常大的表作为数据帧

我有非常大的表(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)

有没有更好的方法呢?或者很可能完全不同的方法来解决问题?

import r dataframe r-faq

489
推荐指数
9
解决办法
19万
查看次数

加快write.table的性能

我有一个data.frame,我想写出来.我的尺寸data.frame是256行乘65536列.什么是更快的替代品write.csv

r

42
推荐指数
3
解决办法
2万
查看次数

加速RData加载

我已经检查了几个相关的问题,比如这个

如何快速将数据加载到R?

我引用了最受好评的答案的特定部分

这取决于您想要做什么以及如何进一步处理数据.在任何情况下,只要您始终需要相同的数据集,从二进制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倍.谢谢你的贡献!

io r

31
推荐指数
2
解决办法
9217
查看次数

更快速地读取CSV文件的单列

我试图尽快读取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兆字节文件所用的时间相同 - 显然是不可接受的.

如何减少这个时间?我希望有一个R解决方案.

csv io optimization performance r

13
推荐指数
2
解决办法
1万
查看次数

将大型数据集加载到 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 fread read.table data.table

3
推荐指数
1
解决办法
6598
查看次数

标签 统计

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