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:
没加入前:
 加入之后:
加入之后:

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