我有一个大的csv文件(6 GB),我想要20%的样本。
这些20%应与大型原始文件具有相同的分布。
例如,采取Kaggles数据:https://www.kaggle.com/c/avazu-ctr-prediction/data
我考虑过块,但我怎样才能使分布变得相同?
尝试read_csv,fread但没有运气。
请告知我该怎么办?我的笔记本电脑无法处理6GB的csv文件。
使用RevoScaleR
库,您可以选择多种方法来分析不适合RAM的数据。
如果您不喜欢此选项,则可以在样本中进行大量剪切(100或200百分位),并分批读取文件,计算每次剪切的记录数。完成后,添加它们,您可以将完整文件的频率分布与样本进行比较,您可以实现ks-test,计算权重均值并进行比较,或以图形方式查看差异。
目前尚不清楚你的意思是“尝试过,但没有运气”。有特定错误吗?你的笔记本电脑有多少内存?
在我的笔记本电脑上(16GB内存),文件可以毫无问题地读取,加载时只占用3.7GB RAM:
import numpy as np
import datatable as dt
from datatable import f
train = dt.fread("~/datasets/avazu/train.csv")
print(train.shape)
# (40428967, 24)
sample = train[np.random.binomial(1, 0.2, size=train.nrows).astype(bool), :]
sample.to_csv("train20.csv") # produces roughly 1.25GB file
但是,如果由于某种原因你的计算机真的无法加载原始文件,那么我建议按列分段加载它;然后将相同的切片应用于每个部分,最后结合结果:
train1 = dt.fread("~/datasets/avazu/train.csv", columns=slice(0, 8))
smp = dt.Frame(np.random.binomial(1, 0.2, size=train1.nrows).astype(bool))
sample1 = train1[smp, :]
del train1
train2 = dt.fread("~/datasets/avazu/train.csv", columns=slice(8, 16))
sample2 = train2[smp, :]
del train2
train3 = dt.fread("~/datasets/avazu/train.csv", columns=slice(16, 24))
sample3 = train3[smp, :]
del train3
sample = dt.cbind(sample1, sample2, sample3)
sample.to_csv("train20.csv")
解决我的问题的方法之一是在R中使用ff
包。现在使用:ff::read.csv.ffdf()
我已经使用指针访问了我的磁盘上的文件。之后我作为常规data.table
/ data_frame
/ tibble
进行了研究。
它帮助了我,希望它能帮到你。