V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
CenN
V2EX  ›  Python

怎么加快 h5py 的写入速度?

  •  
  •   CenN · 2020-10-21 12:53:44 +08:00 · 2325 次点击
    这是一个创建于 1494 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条数据,后面速度变得巨慢无比。 XoC4A3M

    第 1 条附言  ·  2020-10-22 09:11:07 +08:00

    加入 libver='latest'可以大幅提高写入速度。

    with h5py.File(os.path.join(args.data, f'{args.city_name}.h5'), 'w', libver='latest') as f:
    

    没加入前: CIdlrTw 加入之后: t5Yr0vY

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

    我不太熟 h5,不知道 h5 在靠后的数据是否“全体修改、全体写入”,如果是这样,巨型数据后面写入的基本肯定会慢,所以要改成分批写入,分批写入既满足内存,也满足磁盘缓存
    est
        9
    est  
       2020-10-21 14:05:14 +08:00
    @CenN 内存还剩这么多,不如把 swap 禁了试试?
    CenN
        10
    CenN  
    OP
       2020-10-21 14:22:54 +08:00
    我得等这个程序跑完了才能试试其他方法。
    而且在存储之前还要有一段时间计算数据。😢
    CenN
        11
    CenN  
    OP
       2020-10-21 14:26:54 +08:00
    CenN
        12
    CenN  
    OP
       2020-10-21 23:15:07 +08:00 via iPhone
    艹,现在还没跑完。到后面一小时 5w 条。🤣
    princelai
        13
    princelai  
       2020-10-22 09:59:06 +08:00
    试试用 pyarrow 写入呢,我猜也是硬盘缓存写满了,用 iotop 监控下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2312 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:03 · PVG 08:03 · LAX 16:03 · JFK 19:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.