3

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

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

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

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

试过 read_csv,fread 但没有运气。

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

4

3 回答 3

3

目前尚不清楚“尝试过,但没有运气”是什么意思。有没有具体的错误?你的笔记本电脑有多少内存?

在我的笔记本电脑(内存为 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")
于 2018-09-08T02:10:31.937 回答
1

使用该RevoScaleR库,您可以选择许多选项来分析 RAM 中无法容纳的数据。

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

于 2018-08-20T11:56:49.017 回答
0

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

它帮助了我,希望它会帮助你。

于 2018-08-21T09:25:02.517 回答