我有65K的CSV数据.我需要对每个csv行进行一些处理,这会在最后生成一个字符串.我必须在文件中写入/附加该字符串.

Psuedo代码:

for row in csv_data:
   processed_string = ...
   file_pointer.write(processed_string + '\n')

如何使此写入操作并行运行,以便主处理操作不必包括写入文件所需的时间?我try 使用批处理写入(存储n行,然后同时写入).但如果你能给我推荐一些能同时做到这一点的方法,那就太好了.谢谢

Edit:csv文件中有65K条记录.我正在处理它,生成一个字符串(多行大约10-12).我必须把它写进一个文件.对于65K记录,每个记录的结果为10-15行.通常代码需要10分钟才能运行.但添加此文件操作会将时间增加到+2-3分钟.那么,如果我可以并行执行,而不影响代码执行?

下面是代码部分.

for i in range(len(queries)): # 65K runs
    Logs.log_query(i, name, version)

    # processed_results = Some processing ...

    # Final Answer
    s = final_results(name, version, processed_results) # Returns a multiline string
    f.write(s + '\n')

"""
EXAMPLE OUTPUT:
-----------------
[0] NAME: Adobe Acrobat Reader DC | VERSION: 21.005
FAISS RESULTS (with cutoff 0.63)
     id                                               name                         version   eol_date extended_eol_date                   major_version minor_version    score
1486469                            Adobe Acrobat Reader DC                    21.005.20054 07-04-2020        07-07-2020                              21           005 0.966597
 327901                            Adobe Acrobat Reader DC                    21.005.20048 07-04-2020        07-07-2020                              21           005 0.961541
 327904                            Adobe Acrobat Reader DC                    21.007.20095 07-04-2020        07-07-2020                              21           007 0.960825
 327905                            Adobe Acrobat Reader DC                    21.007.20099 07-04-2020        07-07-2020                              21           007 0.960557
 327902                            Adobe Acrobat Reader DC                    21.005.20060 07-04-2020        07-07-2020                              21           005 0.958580
 327900                            Adobe Acrobat Reader DC                    21.001.20145 07-04-2020        07-07-2020                              21           001 0.956085
 327903                            Adobe Acrobat Reader DC                    21.007.20091 07-04-2020        07-07-2020                              21           007 0.954148
1486465                            Adobe Acrobat Reader DC                    20.006.20034 07-04-2020        07-07-2020                              20           006 0.941820
1486459                            Adobe Acrobat Reader DC                    19.012.20035 07-04-2020        07-07-2020                              19           012 0.928502
1486466                            Adobe Acrobat Reader DC                    20.012.20048 07-04-2020        07-07-2020                              20           012 0.928366
1486458                            Adobe Acrobat Reader DC                    19.012.20034 07-04-2020        07-07-2020                              19           012 0.925761
1486461                            Adobe Acrobat Reader DC                    19.021.20047 07-04-2020        07-07-2020                              19           021 0.922519
1486463                            Adobe Acrobat Reader DC                    19.021.20049 07-04-2020        07-07-2020                              19           021 0.919659
1486462                            Adobe Acrobat Reader DC                    19.021.20048 07-04-2020        07-07-2020                              19           021 0.917590
1486464                            Adobe Acrobat Reader DC                    19.021.20061 07-04-2020        07-07-2020                              19           021 0.912260
1486460                            Adobe Acrobat Reader DC                    19.012.20040 07-04-2020        07-07-2020                              19           012 0.909160
1486457                            Adobe Acrobat Reader DC                    15.008.20082 07-04-2020        07-07-2020                              15           008 0.902536
 327899                                   Adobe Acrobat DC                    21.007.20099 07-04-2020        07-07-2020                              21           007 0.895940
1277732                        Acrobat Reader DC (classic)                            2015 07-07-2020                 *                            2015           NaN 0.875471

OPEN SEARCH RESULTS (with cutoff 13)
{ "score": 67.98198, "id": 327901, "name": Adobe Acrobat Reader DC, "version": 21.005.20048, "eol_date": 2020-04-07, "extended_eol_date": 2020-07-07 }
{ "score": 66.63623, "id": 327902, "name": Adobe Acrobat Reader DC, "version": 21.005.20060, "eol_date": 2020-04-07, "extended_eol_date": 2020-07-07 }
{ "score": 65.96028, "id": 1486469, "name": Adobe Acrobat Reader DC, "version": 21.005.20054, "eol_date": 2020-04-07, "extended_eol_date": 2020-07-07 }
FINAL ANSWER [OPENSEARCH]
{ "score": 67.98198, "id": 327901, "name": Adobe Acrobat Reader DC, "version": 21.005.20048, "eol_date": 2020-04-07, "extended_eol_date": 2020-07-07 }
----------------------------------------------------------------------------------------------------

"""

推荐答案

Q : " Writing to a file parallely while processing in a loop in python ... "

A :
坦率地说,文件I/O不是与性能相关的敌人.

"With all due respect to the colleagues, Python (since ever) used GIL-lock to avoid any level of concurrent execution ( actually re-SERIAL-ising the code-execution flow into dancing among any amount of threads, lending about 100 [ms] of code-interpretation time to one-AFTER-another-AFTER-another, thus only increasing the interpreter's overhead times ( and devastating all pre-fetches into CPU-core caches on each turn ... paying the full mem-I/O costs on each next re-fetch(es) ). So threading is ANTI-pattern in python (except, I may accept, for network-(long)-transport latency masking ) – user3666197 44 mins ago "

考虑到CSV中列出的65k文件应该尽快得到处理,性能优化的编排是目标,文件I/O只是其中一个微不足道的部分(设计良好,延迟可屏蔽)(这并不意味着,我们不能再搞砸它了(如果试图以另一种 destruct 性能的反模式组织它),我们可以吗?)


避免&;Tip #1 :;如果以表现为目标,不要使用任何低垂的水果SLOC


如果代码以有史以来最便宜的迭代器子句开头,
无论是模拟for aRow in aCsvDataSET: ...
还是真正的代码for i in range( len( queries ) ): ...——这些(除了多年来被认为是python代码解释能力中非常慢的一部分之外,第二个甚至是Py3中的迭代器-on-range()-iterator,甚至是Py2生态系统中的静默RAM killer,适用于任何更大范围)在" struct 化编程"中都很好看福音传播,因为它们形成了代码更深层次部分的符合语法的分离,但由于重复支付的管理费用累积,这样做的成本非常高.最后注入的"协调"无序并发文件I/O操作的需求,原则上完全没有必要,如果做得聪明的话,就是这样一个例子,如果使用这样一个微不足道的SLOC(以及类似糟糕的设计决策),会对性能产生不利影响.

更好的方法?

  • a)避免顶层(缓慢和开销昂贵)循环
  • b)"将"65k参数空间分割为不超过物理设备上内存I/O通道数量的块(我可以从发布的文本中猜测,评分过程是内存I/O密集型的,因为一些模型必须遍历所有文本才能进行评分)
  • c)产生n_jobs多名工艺工人,他们将为65k长参数空间的这种分布式块部分运行joblib.Parallel( n_jobs = ... )( delayed( <_scoring_fun_> )( block_start, block_end, ...<_params_>... ) )scoring_fun(...).
  • d)在计算了分数和相关输出后,每个工人流程可以并且应该将自己的结果归档到其私有、专有、防止冲突的输出文件中
  • e)完成所有部分块部件的处理后,如果需要,main Python进程可以直接连接已存储的输出(刚刚[并发]创建、平滑和非阻塞的ly O/S缓冲/交错流、实际硬件存储),如果需要的话

如果对tweaking a real-system End-to-End processing-performance感兴趣,
101 map开始
接下来验证物理内存I/O通道的数量
并且
可以稍微try 一下Python joblib.Parallel()进程实例化,在订阅103的情况下,订阅比物理内存I/O通道的数量低一点或高一点.如果实际处理有一些隐藏的、可屏蔽的延迟,可能会产生更多n_jobs个工作人员,直到端到端处理性能保持稳定增长,直到系统噪声掩盖了任何此类进一步的性能调整效果

Bonus部分——为什么不受管理的延迟源会扼杀性能

Python-3.x相关问答推荐

如何有效地计算Kernel/Matrix

Python根据阈值对数字进行分组

Python多处理池:缺少一个进程

根据另一列中的条件填写该列中的值

如何将参数/值从测试方法传递给pytest的fixture函数?

在循环中使用Print&S结束参数时出现奇怪的问题

从 https://www.niftytrader.in/stock-options-chart/sbin 提取 SBIN 股票最大痛苦值的 Python 代码不起作用 - 我错过了什么?

如何在 20 秒后重复使用 Pillow 在现有图像上创建新图像?

如何使用复选按钮更改 Pyplot 轴的属性?

有没有办法使用 python opencv 计算与图像的白色距离

正则表达式来识别用 Python 写成单词的数字?

Dask 多阶段资源设置导致 Failed to Serialize 错误

如何在带有 GUI 的 python 游戏中设置回答时间限制?

在 jupyter notebook 的单元格中使用 sudo

如何从字典中打印特定键值?

如何为 Python 中的线程设置异步事件循环?

virtualenv virtualenvwrapper virtualenv:错误:无法识别的参数:--no-site-packages

Python3 mysqlclient-1.3.6(又名 PyMySQL)的用法?

为现有项目创建virtualenv

为什么异步库比这个 I/O 绑定操作的线程慢?