我有一个大的 csv 文件(6 GB),我想对其中的 20% 进行采样。
这 20% 应该与大原始文件具有相同的分布。
以 Kaggles 数据为例: https ://www.kaggle.com/c/avazu-ctr-prediction/data
我考虑过块,但我怎样才能让分布相同?
试过 read_csv,fread 但没有运气。
请告知我该怎么做?我的笔记本电脑无法处理 6GB 的 csv 文件。
我有一个大的 csv 文件(6 GB),我想对其中的 20% 进行采样。
这 20% 应该与大原始文件具有相同的分布。
以 Kaggles 数据为例: https ://www.kaggle.com/c/avazu-ctr-prediction/data
我考虑过块,但我怎样才能让分布相同?
试过 read_csv,fread 但没有运气。
请告知我该怎么做?我的笔记本电脑无法处理 6GB 的 csv 文件。
目前尚不清楚“尝试过,但没有运气”是什么意思。有没有具体的错误?你的笔记本电脑有多少内存?
在我的笔记本电脑(内存为 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
但是,如果由于某种原因您的计算机确实无法加载原始文件,那么我建议您按列加载它;然后将相同的切片应用于每个部分,最后 cbind-ing 结果:
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")
使用该RevoScaleR
库,您可以选择许多选项来分析 RAM 中无法容纳的数据。
如果您不喜欢此选项,您可以在样本中进行大量切割(100 或 200 个百分位数),并分批读取文件,计算每个切割中有多少记录。完成后,添加它们,您可以将完整文件的频率分布与样本进行比较,您可以实施 ks-test,计算权重均值并比较它们,或者以图形方式查看差异。
解决我的问题的方法之一是ff
在 R 中使用包。现在使用:ff::read.csv.ffdf()
我已经使用指针访问了磁盘上的文件。之后,我像常规一样data.table
/ data_frame
/进行了研究tibble
。
它帮助了我,希望它会帮助你。