平台是 pytorch ,数据集情况是单条很小,大概不到 1KB ( json+gzip 存到硬盘上),总数据大概 200 万条左右,存硬盘上体积很小,但是发现加载到 py 内存之后会变得非常大,垃圾电脑内存实在装不下。
目前的数据储存方式是,由于语料是存在文章里的,所以文件夹里大概有一万个文件,每个文件几个 MB ,每个文件里面包含若干条训练数据。
用自定义 dataloader 的话,如果开启随机读取,系统 IO 会爆炸,每次都需要读很多文件,然后从里面选取几条,剩下大部分的读取都是无效读取。。
后面换了一种方式是把数据集中到几个大文件中,然后 dataloader 选用顺序读取,这样每次就可以 load 很多到内存里不用频繁 IO ,但是缺点是只能顺序读取,读取又慢如狗,我这 ssd 也不知道 torch 为啥加载这么慢。。还有内存效率也很奇怪,硬盘上存的数据压缩后大概 200M ,加载到内存里进程内存就要超过 5-6 个 G ,每次多读两个文件的话直接爆炸。。
大佬们有啥读取数据的实现方式可以推荐下么,我去看了下 torchvision 的实现,似乎里面的数据集没有类似情况的
1
murmur 2022-06-28 14:07:59 +08:00 1
32 个 gb 以下都不需要考虑,直接买内存
你如果买二手服务器,128g 以下应该都不需要考虑 我们以前实验室做电磁学仿真用的服务器是 1tb 内存的,对 1tb 的 内存 |
3
aaniao002 2022-06-28 19:02:37 +08:00 via Android
办公室机器就直接加内存,自己家机器就把 linux swap 开几百 g ,至少能跑。
|
4
jasondennis12139 2022-06-28 19:27:55 +08:00
加内存加内存
![截屏 2022-06-28 下午 7.27.32]( https://pico-1257283959.cos.ap-nanjing.myqcloud.com/cloud-img/%E6%88%AA%E5%B1%8F2022-06-28%20%E4%B8%8B%E5%8D%887.27.32.png) |
5
NoobStone 2022-06-29 12:27:58 +08:00 1
没怎么用过 pytorch ,你现在的方式:“换了一种方式是把数据集中到几个大文件中,然后 dataloader 选用顺序读取,这样每次就可以 load 很多到内存里不用频繁 IO ,但是缺点是只能顺序读取”。
感觉我之前的做法你可以参考,不一定行得通。 我用 keras 训练图像模型的时候,是把所有图片都存储到 HDF5 ,存进去之后,open 这个超大的 HDF5 文件,只是打开一个指针不会占用内存,可以按照切片语法来读取数据,感觉用起来特别像一个存储在硬盘的 numpy 矩阵。切片读取的话,索引要保证去重,升序。如果你想随机读取数据,需要自己做下处理。 比如 HDF5 是 arr ,长度 100 ,现在随机读取 6,5,8,9,6 ,那么需要改成 arr[5,6,8,9],然后自己展开。 |