暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kaggle知识点:节约内存的四种方法

Coggle数据科学 2022-02-16
2868

在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=4as 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论