【问题标题】:mysql read -> process -> update, optimize for huge datamysql读取->处理->更新,针对大数据进行优化
【发布时间】:2018-08-04 11:53:58
【问题描述】:

我有一个简单的任务。从mysql读取数据->执行一些操作(不是很重)->然后将结果更新回mysql DB`。数据库中有 20 个不同的表(每个表约 600000 行)。

我使用ThreadPoolExecutor(max_workers=20) 编写了一个python 脚本来优化整体执行时间,但这需要大约40 个小时。我想为下一次运行优化它。

我尝试运行多个代码实例,但性能不是很重要。 有没有更好的方法来快速完成任务,比如分布式代码或任何人都知道的东西?

简约的代码算法

conn.autocommit = True
ThreadPoolExecutor(max_workers=20)
  1. 读取数据并逐个元组处理如下
  2. 使用 TextBlob().detect_language() 从句子中检测语言
  3. 更新回表

【问题讨论】:

  • 这个问题的答案介于“是的,微不足道的”和“不,40 小时是你能做的最好的”之间。究竟是哪一个将取决于您到底在做什么,因此您应该分享您的代码(相关和最小化的部分),否则,很遗憾我们帮不了您太多。
  • 描述事物。如果你不知道大部分时间在哪里浪费,你怎么能做得更好?也许它的mysql也许它的处理代码。 GIL 也只影响线程,你可以多进程。
  • 感谢您添加一些详细信息。 TextBlob().detect_language() 向 google api 发送请求。这将限制您的吞吐量(mysql 部分可能会对执行速度产生大约 0.01% 的影响)。尝试使用其他软件(本地安装)。

标签: python mysql optimization distributed-computing


【解决方案1】:

最快的方法是每隔几千行创建插入和提交。将所有内容写入文件。删除索引使用 mysql 客户端和 creata 索引加载数据。针对批量操作优化服务器。

Python 中的并行性不起作用。 Parallelism in python isn't working right

【讨论】:

  • 使用 MySQL 导入数据的最快方法是使用 LOAD DATA INFILE dev.mysql.com/doc/refman/5.7/en/load-data.html
  • 将数据放入文件,然后将文件加载到数据库中,这不是一个时间常数操作吗?我以前使用过LOAD DATA INFILE,但我不确定这是不是合适的用例。当我将数据写入文件时,我可以直接写入数据库,这只是我的想法。
  • 将文件写入随后的LOAD 的开销可能导致它变慢。 OTOH,如果您已经将数据保存在文件中,LOAD 是最好的。
  • 执行的 I/O 越多,获得的并行度就越少。我会尝试两个进程,每个进程收集 1000 行,然后将它们发送到 MySQL。该乒乓球可能会有效地在重 python 使用和重 mysql 使用之间交替。三个进程可能不会运行得更快。
猜你喜欢
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2019-11-23
  • 2017-09-06
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多