我有一个5GB
csv,有200万行。标头以逗号分隔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()
对不同备选方案的估计。
其他:
答案 0 :(得分:5)
我认为这应该会很快起作用,但请告诉我,因为我还没有尝试过大数据。
write.csv(iris,"iris.csv")
fread("shuf -n 5 iris.csv")
V1 V2 V3 V4 V5 V6
1: 37 5.5 3.5 1.3 0.2 setosa
2: 88 6.3 2.3 4.4 1.3 versicolor
3: 84 6.0 2.7 5.1 1.6 versicolor
4: 125 6.7 3.3 5.7 2.1 virginica
5: 114 5.7 2.5 5.0 2.0 virginica
这为iris
数据集采用N = 5的随机样本。
为了避免再次使用标题行,这可能是一个有用的修改:
fread("tail -n+2 iris.csv | shuf -n 5", header=FALSE)
答案 1 :(得分:5)
这里有一个包含100000行的文件,如下所示:
"","a","b","c"
"1",0.825049088569358,0.556148858508095,0.591679535107687
"2",0.161556158447638,0.250450366642326,0.575034103123471
"3",0.676798462402076,0.0854280597995967,0.842135070590302
"4",0.650981109589338,0.204736212035641,0.456373531138524
"5",0.51552157686092,0.420454133534804,0.12279288447462
$ wc -l d.csv
100001 d.csv
这样的100000行加上一个标题。如果从0到1的随机数大于0.9,我们希望保留标题并对每一行进行采样。
$ awk 'NR==1 {print} ; rand()>.9 {print}' < d.csv >sample.csv
检查:
$ head sample.csv
"","a","b","c"
"12",0.732729186303914,0.744814146542922,0.199768838472664
"35",0.00979996216483414,0.633388962829486,0.364802648313344
"36",0.927218825090677,0.730419414117932,0.522808947600424
"42",0.383301998255774,0.349473554175347,0.311060158303007
它有10027行:
$ wc -l sample.csv
10027 sample.csv
这在我的4-yo盒子上实时需要0.033秒,可能HD速度是这里的限制因素。它应该线性扩展,因为文件是严格逐行处理的。
然后根据需要使用sample.csv
或read.csv
阅读fread
:
> s = fread("sample.csv")
答案 2 :(得分:2)
您可以使用sqldf::read.csv.sql
和SQL命令来提取数据:
library(sqldf)
write.csv(iris, "iris.csv", quote = FALSE, row.names = FALSE) # write a csv file to test with
read.csv.sql("iris.csv","SELECT * FROM file ORDER BY RANDOM() LIMIT 10")
Sepal_Length Sepal_Width Petal_Length Petal_Width Species
1 6.3 2.8 5.1 1.5 virginica
2 4.6 3.1 1.5 0.2 setosa
3 5.4 3.9 1.7 0.4 setosa
4 4.9 3.0 1.4 0.2 setosa
5 5.9 3.0 4.2 1.5 versicolor
6 6.6 2.9 4.6 1.3 versicolor
7 4.3 3.0 1.1 0.1 setosa
8 4.8 3.4 1.9 0.2 setosa
9 6.7 3.3 5.7 2.5 virginica
10 5.9 3.2 4.8 1.8 versicolor
它不会为您计算10%,但您可以选择要返回的行的绝对限制。