怎么加快 h5py 的写入速度?

2020-10-21 12:53:44 +08:00
 CenN
with h5py.File(os.path.join(args.data, f'{args.city_name}.h5'), "w") as f:
    f.attrs['num'] = len(routes_valid)
    f.create_group('/trips/coord')
    f.create_group('/trips/osmid')
    f.create_group('/trips/length')
    for i in range(len(routes_length)):
        f.create_dataset(f'/trips/coord/{i + 1}', data=np.array(routes_coord[i]))
        f.create_dataset(f'/trips/osmid/{i + 1}', data=np.array(routes_valid[i]))
        f.create_dataset(f'/trips/length/{i + 1}', data=np.array(routes_length[i]))
        i % 5_0000 == 0 and print_time(f'saved {i} trips')

大约有 150w 条数据,后面速度变得巨慢无比。

2182 次点击
所在节点    Python
13 条回复
imn1
2020-10-21 13:16:53 +08:00
前面都是 5w/min,70w 开始时间大幅增加,盲猜是内存不够(我不熟 h5 )
你看看能否调整内存 /缓存,或者将后面的改为追加方式(不需要那么多内存),h5 有追加方式吧?
nightwitch
2020-10-21 13:43:46 +08:00
建议先开另外个窗口监视内存,确定是不是内存不够再来寻找解决方案
nightwitch
2020-10-21 13:44:20 +08:00
#fix: 不好意思看错了,我以为 1 楼是楼主的回复
CenN
2020-10-21 13:51:15 +08:00
@imn1 系统内存是够的。
![9r4nfx2]( )
有追加方式的。
主要是我的数据是计算出来的,计算了大半天,没想到没有存储花的时间多。
CenN
2020-10-21 13:54:24 +08:00
有熟悉 h5py 的大佬吗
est
2020-10-21 13:55:41 +08:00
@CenN 那个 swp 是交换分区写满了??
CenN
2020-10-21 14:00:46 +08:00
@est
imn1
2020-10-21 14:04:29 +08:00
@CenN #4
有两个点,跟 h5 没关系,其他工具都一样:
1.系统内存够用,也要工具本身能调度才行,如果它没有无限调度的设置,只能使用指定数量,那就要调整或适应
2.写盘操作还涉及磁盘缓存,就算 SSD 也一样,超过了就慢,所以要考虑分批写入

我不太熟 h5,不知道 h5 在靠后的数据是否“全体修改、全体写入”,如果是这样,巨型数据后面写入的基本肯定会慢,所以要改成分批写入,分批写入既满足内存,也满足磁盘缓存
est
2020-10-21 14:05:14 +08:00
@CenN 内存还剩这么多,不如把 swap 禁了试试?
CenN
2020-10-21 14:22:54 +08:00
我得等这个程序跑完了才能试试其他方法。
而且在存储之前还要有一段时间计算数据。😢
CenN
2020-10-21 14:26:54 +08:00
CenN
2020-10-21 23:15:07 +08:00
艹,现在还没跑完。到后面一小时 5w 条。🤣
princelai
2020-10-22 09:59:06 +08:00
试试用 pyarrow 写入呢,我猜也是硬盘缓存写满了,用 iotop 监控下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/717067

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX