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
melonux
V2EX  ›  Python

如何有效的存储大批量小文件,并支持未来批量的读取这些文件内容?

  •  
  •   melonux · 2019-03-06 19:06:05 +08:00 · 2857 次点击
    这是一个创建于 2115 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我有一个爬虫,会下载很多新闻页面的原始 html。我目前是把他们保存在 mongodb 里了。但是当我要重新解析这些 html 文件的内容时,我用下述代码来执行解析时,发现从 mongodb 读取成为了瓶颈。每次只能返回 100-200 个 item,之后就要等个几秒再返回下一波。
    for i in db.collection.find({}):
    parse(i['html'])

    我想知道有什么系统,可以方便的存储这些小文件(一般都小于 1MB ),而又能提供较高的批量读取吞吐量。

    非常感谢。
    17 条回复    2019-03-07 10:52:44 +08:00
    mingtiny11
        1
    mingtiny11  
       2019-03-06 19:40:28 +08:00
    随便啥 blob store 都可以呀
    ShangAliyun
        2
    ShangAliyun  
       2019-03-06 19:46:03 +08:00
    为啥不选择对象存储?
    lihongjie0209
        3
    lihongjie0209  
       2019-03-06 19:52:14 +08:00
    你这么写当然会卡了, 所有的时间话费在数据库 IO 上了, 用多线程
    melonux
        4
    melonux  
    OP
       2019-03-06 19:59:28 +08:00
    @lihongjie0209 我知道时间都是在 io 上的。问题在于,mongodb 返回数据太慢了。因为我把文件内容作为 json 的一个字段进行存储的。我要解决的就是如何更有效的存储,以便能快速大批量读取。
    melonux
        5
    melonux  
    OP
       2019-03-06 20:00:15 +08:00
    @mingtiny11 您指的 blob store 是什么? mysql 的 blob 字段吗?
    melonux
        6
    melonux  
    OP
       2019-03-06 20:01:13 +08:00
    @ShangAliyun 对象存储指的是什么?
    mingtiny11
        7
    mingtiny11  
       2019-03-06 20:02:55 +08:00
    @melonux 对象存储呀。
    mingtiny11
        8
    mingtiny11  
       2019-03-06 20:03:28 +08:00
    @melonux 各大云厂商的对象存储了解下
    melonux
        9
    melonux  
    OP
       2019-03-06 20:12:38 +08:00
    @mingtiny11 谢谢,我学习一下
    lihongjie0209
        10
    lihongjie0209  
       2019-03-06 20:14:08 +08:00
    @melonux IO 慢你就多线程啊,mogo 不至于就给一个线程就卡死了
    ShangAliyun
        11
    ShangAliyun  
       2019-03-06 20:38:27 +08:00
    @melonux 阿里云的叫 OSS,腾讯云的叫 COS,本质都是 Object Storage
    melonux
        12
    melonux  
    OP
       2019-03-06 20:48:49 +08:00
    @ShangAliyun 3Q,我刚看了阿里云的 OSS。存储好便宜啊,而且通过 ECS 访问还不收流量费。我明天试试看这个的读取速度有多快。
    melonux
        13
    melonux  
    OP
       2019-03-06 20:49:40 +08:00
    @lihongjie0209 好的。我也去试试多线程的读 mongodb。
    sunnyadamm
        14
    sunnyadamm  
       2019-03-06 21:13:48 +08:00 via Android
    楼上正解,我就不多说了
    billlee
        15
    billlee  
       2019-03-06 22:52:30 +08:00
    太小的文件也不适合对象存储吧,印象中腾讯云 object storage 的分块大小是 1MB. 如果访问的 pattern 允许,还是应该把小文件打包成大一点的
    julyclyde
        16
    julyclyde  
       2019-03-07 09:07:52 +08:00
    早几年大家都是套 XML
    现在改 JSON 了
    mingtiny11
        17
    mingtiny11  
       2019-03-07 10:52:44 +08:00
    @billlee 一般 object 存储底层都是把小文件拼成大文件的,不然怎么高性能。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:14 · PVG 18:14 · LAX 02:14 · JFK 05:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.