【发布时间】:2014-10-04 07:44:51
【问题描述】:
我有一个包含 200 万行的 5GB csv。标题用逗号分隔strings,每一行用逗号分隔doubles,没有丢失或损坏的数据。它是矩形的。
我的目标是尽可能快地将随机 10% 的行(无论是否替换,都无关紧要)读入 RAM 。一个慢速解决方案(但比read.csv 快)的示例是使用fread 读取整个矩阵,然后随机保留10% 的行。
require(data.table)
X <- data.matrix(fread('/home/user/test.csv')) #reads full data.matix
X <- X[sample(1:nrow(X))[1:round(nrow(X)/10)],] #sample random 10%
但是我正在寻找最快的解决方案(这很慢,因为我需要先阅读整个内容,然后再进行修剪)。
值得奖励的解决方案将提供system.time() 对不同替代方案的估计。
其他:
- 我使用的是 Linux
- 我不需要正好 10% 的行。大约只有 10%。
【问题讨论】:
-
您需要对 10% 的行进行采样多少次?
-
您在 Linux 环境中工作吗?
shuf -n N test.csv > output.csv应该适用于随机数量的观察 N 次。它似乎相当快。 stackoverflow.com/questions/9245638/… -
是不是 shuf 必须将整个内容读入内存(或内存映射),所以对于 5GB 文件来说很慢?值得一试...
-
您需要恰好 10% 还是让每行有1/10 的概率是可以接受的?后者很容易使用
awk命令行过滤器来完成,但可能不会给你正好 1/10 的行数。 -
@Spacedman 不完全是 10%。 1/10 的概率完全没问题。
标签: r performance csv io fread