分析 R/Python 中巨大的 csv 文件并根据文件的分布抽取 X%?

Analyse huge csv file in R/Python and sampling X% according to the distribution of the file?

我有一个很大的 csv 文件 (6 GB),我想对其中的 20% 进行采样。

这 20% 应该与大的原始文件具有相同的分布。

以Kaggles数据为例: https://www.kaggle.com/c/avazu-ctr-prediction/data

我考虑过块,但我怎样才能使分布相同?

尝试过read_csv,害怕但运气不好。

请指教我该怎么做?我的笔记本电脑无法处理 6GB 的 csv 文件。

使用 RevoScaleR 库,您有许多选项来分析不适合 RAM 的数据。

如果您不喜欢这个选项,您可以在样本中进行大量切割(100 或 200 个百分位数),然后分批读取您的文件,计算每次切割中有多少条记录。当你完成后,你添加它们,你可以比较完整文件与样本的频率分布,你可以实施 ks-test,计算权重均值并比较它们,或者以图形方式查看差异。

解决我的问题的方法之一是在 R 中使用 ff 包。 现在使用:ff::read.csv.ffdf() 我已经使用指针访问了磁盘上的文件。 之后我按照常规 data.table / data_frame / tibble.

进行了处理

对我有帮助,希望对你有帮助。

不清楚您所说的 "tried fread, but without luck" 是什么意思。有没有特定的错误?您的笔记本电脑有多少内存?

在我的笔记本电脑(16GB 内存)上可以毫无问题地读取文件,加载时仅占用 3.7GB 内存:

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")