在Kaggle的Kernel环境中Notebook的内存是受限的,此时如果内存超过限制则代码直接会报错。哪么如何读取并完成比内存还大的文件呢?
操作1:优化Pandas使用
Pandas
是一个有效的并能快速读取表格的工具,但默认情况下会读取csv的所有内容,就直接导致内存溢出。
在读取指定数据类型
在Pandas
中的read_csv
函数中,可以直接在读取数据的时候指定数据类型,即dtype
参数。同样也可以使用usecols
参数选择部分列,进行读取。
dtypes = {
'Id': 'uint32',
'groupId': 'uint32',
'matchId': 'uint16',
'assists': 'uint8',
'boosts': 'uint8'
}
train = pd.read_csv('train.csv',
dtype=dtypes)
按照索引读取文件
在Pandas
中的read_csv
函数中,可以直接指定读取的文件的行数:skiprows
从文件头开始跳过的行数,nrows
为具体读取的行数。
train = pd.read_csv('train.csv',
skiprows=100000,
nrows=1000)
分chunksize读取文件
在Pandas
中的read_csv
函数中,可以通过chunksize
设置每次读取的的文件大小,并进行分批次读取。
with pd.read_csv("train.csv", chunksize=4) as reader:
for chunk in reader:
print(chunk)
操作2:使用SQLite
由于Pandas
需要将文件读取到内存再进行操作,但数据库不需要。
在Kaggle中可以手动将文件写入SQLite
,并在数据库中完全查询和统计操作。
参考代码:https://www.kaggle.com/tomooinubushi/62nd-solution-lightgbm-single-model-lb-0-801
操作3:使用memmap
如果你在代码中可以将文件存储为矩阵的形式,那么numpy.memmap
就是你需要的。
numpy.memmap
为存储在磁盘上的二进制文件中的数组创建内存映射,可用于访问磁盘上大文件的小段,无需将整个文件读入内存。
fp = np.memmap('data.mem', dtype='float32',
mode='w+', shape=(3,4))
fp.flush()
numpy.memmap
可以很方便快速读取矩阵,比较适合特征存储的情况下,读取的速度也非常快。
操作4:LGB使用Dataset
在LightGBM
中可以直接传入表格,或者使用Dataset的方式。同时也可以将Dataset存储为二进制,然后指定从文件进行训练。
train_data = lightgbm.Dataset(train,
label=train['is_attributed'],
feature_name=predictors,
categorical_feature=categorical)
train_data.save_binary('train_v1.bin')
train = lightgbm.Dataset('train_v1.bin',
feature_name=predictors,
categorical_feature=categorical)
使用Dataset可以让LightGBM
需要的内存更少,内存使用也更加平稳。


文章转载自Coggle数据科学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




