加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 我应该如何优化这个文件系统I / O绑定程序?

发布时间:2020-12-20 12:25:17 所属栏目:Python 来源:网络整理
导读:我有一个 python程序,它做这样的事情: 从csv文件中读取一行. 对它进行一些转换. 将它们分解为实际的行,因为它们将被写入数据库. 将这些行写入单个csv文件. 除非文件已完全阅读,否则请返回步骤1. 运行SQL * Loader并将这些文件加载??到数据库中. 第6步并没有
我有一个 python程序,它做这样的事情:

>从csv文件中读取一行.
>对它进行一些转换.
>将它们分解为实际的行,因为它们将被写入数据库.
>将这些行写入单个csv文件.
>除非文件已完全阅读,否则请返回步骤1.
>运行SQL * Loader并将这些文件加载??到数据库中.

第6步并没有真正花费太多时间.似乎步骤4占据了大部分时间.在大多数情况下,我想优化它来处理在具有某种RAID设置的四核服务器上运行的数百万的记录集.

我必须解决这个问题:

>从第一步读取整个文件(或至少以非常大的块读取)并将文件整体或以非常大的块写入磁盘.这个想法是硬盘在文件之间来回花费的时间更少.这会做什么缓冲不会?
>将步骤1,2和3和4并行化为单独的过程.这将使步骤1,2和3不必等待4完成.
>将加载文件分解为单独的块并并行处理它们.不需要按任何顺序处理行.这可能需要以某种方式与步骤2结合.

当然,这个问题的正确答案是“通过测试做你认为最快的事情”.但是,我主要想弄清楚我应该先把时间花在哪里.在这些问题上有更多经验的人有什么建议吗?

解决方法

Python已经进行了IO缓冲,操作系统应该处理预取输入文件和延迟写入,直到它需要RAM来处理其他内容,或者只是对RAM中的脏数据持续太长时间感到不安.除非您强制操作系统立即写入它们,例如在每次写入后关闭文件或在O_SYNC模式下打开文件.

如果操作系统没有做正确的事情,您可以尝试提高缓冲区大小(第三个参数为open()).对于适当值的一些指导,给定100MB / s 10ms延迟IO系统,1MB IO大小将导致大约50%的延迟开销,而10MB IO大小将导致9%的开销.如果它仍然是IO绑定,您可能只需要更多带宽.使用特定于操作系统的工具来检查您从磁盘获取/从哪种带宽.

同样有用的是检查步骤4是否花费了大量时间执行或等待IO.如果它正在执行,你需要花更多的时间来检查哪个部分是罪魁祸首并对其进行优化,或者将工作分成不同的流程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读