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 条数据,后面速度变得巨慢无比。
加入 libver='latest'
可以大幅提高写入速度。
with h5py.File(os.path.join(args.data, f'{args.city_name}.h5'), 'w', libver='latest') as f:
没加入前: 加入之后:
1
imn1 2020-10-21 13:16:53 +08:00
前面都是 5w/min,70w 开始时间大幅增加,盲猜是内存不够(我不熟 h5 )
你看看能否调整内存 /缓存,或者将后面的改为追加方式(不需要那么多内存),h5 有追加方式吧? |
2
nightwitch 2020-10-21 13:43:46 +08:00
建议先开另外个窗口监视内存,确定是不是内存不够再来寻找解决方案
|
3
nightwitch 2020-10-21 13:44:20 +08:00
#fix: 不好意思看错了,我以为 1 楼是楼主的回复
|
4
CenN OP |
5
CenN OP 有熟悉 h5py 的大佬吗
|
8
imn1 2020-10-21 14:04:29 +08:00
@CenN #4
有两个点,跟 h5 没关系,其他工具都一样: 1.系统内存够用,也要工具本身能调度才行,如果它没有无限调度的设置,只能使用指定数量,那就要调整或适应 2.写盘操作还涉及磁盘缓存,就算 SSD 也一样,超过了就慢,所以要考虑分批写入 我不太熟 h5,不知道 h5 在靠后的数据是否“全体修改、全体写入”,如果是这样,巨型数据后面写入的基本肯定会慢,所以要改成分批写入,分批写入既满足内存,也满足磁盘缓存 |
10
CenN OP 我得等这个程序跑完了才能试试其他方法。
而且在存储之前还要有一段时间计算数据。😢 |
11
CenN OP |
12
CenN OP 艹,现在还没跑完。到后面一小时 5w 条。🤣
|
13
princelai 2020-10-22 09:59:06 +08:00
试试用 pyarrow 写入呢,我猜也是硬盘缓存写满了,用 iotop 监控下
|