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

在 kafka 的介绍中看到因为顺序读写磁盘所以很快, 那么请问在 Python 中如何实现顺序读写磁盘?还是说 Python 本身就是顺序读写磁盘的,如果用'a'追加模式打开文件

  •  1
     
  •   smallpython · 263 天前 · 2647 次点击
    这是一个创建于 263 天前的主题,其中的信息可能已经有所发展或是发生改变。
    22 条回复    2021-03-17 23:07:57 +08:00
    ruandao
        1
    ruandao  
       263 天前   ❤️ 2
    不是因为零拷贝所以比较快吗?
    lusi1990
        2
    lusi1990  
       263 天前
    HDD 顺序读写 比 乱序读写 快
    jim9606
        3
    jim9606  
       263 天前
    如果你没用 os.lseek,那基本就是顺序读写,具体是不是顺序读写还要看文件是不是顺序分布在磁盘上,但这是文件系统管的事,python 管不着这个。
    ch2
        4
    ch2  
       263 天前
    你往一个打开的文件里 write 大量的数据,操作系统就会以顺序的方式写进磁盘
    如果你开了一堆不同的文件,这个写一点那个写一点,大概率就是乱序写
    搞个前端的项目,npm install 一下几十万个文件,然后再把 node_module 移动到回收站,你就能观察到什么叫乱序读写
    xupefei
        5
    xupefei  
       263 天前 via iPhone
    顺序还是乱序是系统底层的事,面向用户的是一个抽象层,不再有顺序乱序的概念。
    不过有一句话是可以说的:如果不断追加写入同一个文件,那这个文件在磁盘里是一整块的可能性比较高。
    BBCCBB
        6
    BBCCBB  
       262 天前
    比如机械盘, 就是不要让他重复去寻址, 写完继续在当前地址继续写..
    lewis89
        7
    lewis89  
       262 天前 via iPhone
    一般是预申请磁盘空间,这样文件驱动系统分配会连续
    wakzz
        8
    wakzz  
       262 天前
    1. 同一个文件从头都到尾
    2. 该文件物理磁盘位置顺序,即写的时候是先申请大块存储空间,然后再在申请的空白空间上写文件,防止文件碎片的问题
    3. 该文件不修改或少修改,避免文件碎片
    wakzz
        9
    wakzz  
       262 天前   ❤️ 1
    @ruandao 零拷贝看上去高大上,其实效果远不如物理文件顺序读写,IO 读写才是性能损耗大头,数据内核拷贝的消耗相对来说就是个零头
    smallpython
        10
    smallpython  
    OP
       262 天前
    @jim9606 这就是我疑惑的点, 我也觉得默认就是顺序读写的, 但是如果是这样的话 kafka 单独拿这个出来吹嘘就感觉很奇怪了, 可能还是得深入了解一下他到底是什么意思
    xxxyh
        11
    xxxyh  
       262 天前
    kafka 只有追加写的场景,肯定是顺序写,又不是 mysql,还有中间插入一条记录和修改某条记录的需求
    4kingRAS
        12
    4kingRAS  
       262 天前
    计算机的原理都是相似的,可以看看 malloc 的算法。为了减少 “找 /切换” 的开销,就会用 “池 /预分配” 的方法。
    passerbytiny
        13
    passerbytiny  
       262 天前 via Android
    印象中,kafka 只用很小的篇幅介绍了“顺序读写的 HDD 也很快”,然后花了大量的篇幅去介绍它是如何做到顺序读写的。
    cheng6563
        14
    cheng6563  
       262 天前
    一些支持数据库都是写一点数据就写一点日志的,写完日志又回去标记下数据,这样就不顺序了。
    xx6412223
        15
    xx6412223  
       262 天前
    @smallpython kafka 的快主要是工作的流程上。client 和分区一一对应,无锁,无随机读,无数据预处理。直接将一个文件的字节一段段传输给 client 。
    draymonder
        16
    draymonder  
       262 天前   ❤️ 1
    emm,真想知道 kafka 吞吐量

    就去看 kafka 的 paper 以及 io 的原理 https://strikefreedom.top/linux-io-and-zero-copy
    swulling
        17
    swulling  
       262 天前
    @smallpython 人家也没有吹嘘。

    顺序读写你直接 append 是无法保证顺序的,kafka 是通过预创建 segment 文件才能保证顺序,每个文件大小默认应该是 1G 。另外读取用的 MMAP 才能保证零拷贝读取,这里面有很多工程细节,远不如你想的那么简单。
    abersheeran
        18
    abersheeran  
       262 天前
    任何语言,不 seek 只用 write 都是会保持写入顺序的,但是实际落盘的扇区不一定连续。扇区不连续就意味着读的时候磁头还会做无意义的移动,而不是很顺畅的从头划到尾就行了。

    你可以试试用 Python 在一块垃圾机械磁盘上不停 write,效率还是不错的,我在公司发给我的垃圾电脑上试过。

    另外,如果你使用过 Windows,那么应该记得 Windows 有一个系统功能就是整理碎片。这个碎片就是指扇区的分布太散,文件读写的时候会慢。
    GrayXu
        19
    GrayXu  
       262 天前
    @smallpython 这里的 default 只是说选择吧,不是说这个设计是 naive 的。。
    mepwang
        20
    mepwang  
       262 天前
    这和操作系统的 IO 缓存机制有关
    由于 IO 操作比 CPU 和内存操作慢数个数量级,在进行磁盘 IO 时,操作系统不会一次只读取一个或几个字节,而是一次性读取一大块数据(比如每次 IO 都会读取 64K )。要是顺序读取的话,需要的数据大概率落在一个数据块中,实际发生的 IO 操作只有一次,因此就表现的比较快。
    sakura1
        21
    sakura1  
       262 天前
    这两个问题不是一个层面的问题吧,python 不得参考 python 的解释器,如果是 c 写的,那不得看对应的系统调用是哪个,kafka 写磁盘用的是 java nio,jvm 的实现底层也是系统调用,所以说这个问题,往深里挖跟 python 与 kafka 关系不大。
    zhzy0077
        22
    zhzy0077  
       262 天前
    @smallpython 顺序写大家都行,但是只用顺序写实现一个 Kafka 就不是人人都能做到的了,普通人 append-only 写个二叉树更新都难
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   982 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:05 · PVG 06:05 · LAX 14:05 · JFK 17:05
    ♥ Do have faith in what you're doing.