gpt4 book ai didi

python - 如何在生产 MySQL 数据库上更新 400k 行并且不杀死它

转载 作者:可可西里 更新时间:2023-11-01 07:57:33 24 4
gpt4 key购买 nike

在我们的生产服务器上,我们需要将 900k 图像拆分到不同的目录并更新 400k 行(带有 InnoDB 引擎的 MySQL)。我写了一个 python 脚本来执行后续步骤:

  1. 从数据库中选择一小块数据(10 行)
  2. 创建新目录
  3. 将文件复制到创建的目录并重命名
  4. 更新数据库(更新时有一些触发器会加载服务器)
  5. 重复

我的代码:


import os, shutil
import database # database.py from tornado

LIMIT_START_OFFSET = 0
LIMIT_ROW_COUNT = 10
SRC_PATHS = ('/var/www/site/public/upload/images/',)
DST_PATH = '/var/www/site/public/upload/new_images/'

def main():
offset = LIMIT_START_OFFSET
while True:
db = Connection(DB_HOST, DB_NAME, DB_USER, DB_PASSWD)
db_data = db.query('''
SELECT id AS news_id, image AS src_filename
FROM emd_news
ORDER BY id ASC
LIMIT %s, %s''', offset, LIMIT_ROW_COUNT)
offset = offset + LIMIT_ROW_COUNT
news_images = get_news_images(db_data) # convert data to easy-to-use list
make_dst_dirs(DST_PATH, [i['dst_dirname'] for i in news_images]) # make news dirs
news_to_update = copy_news_images(SRC_PATHS, DST_PATH, news_images) # list of moved files
db.executemany('''
UPDATE emd_news
SET image = %s
WHERE id = %s
LIMIT 1''', [(i['filename'], i['news_id']) for i in news_to_update])
db.close()
if not db_data: break

if __name__ == '__main__':
main()

非常简单的任务,但我对性能有点紧张。

我怎样才能让这个脚本更有效率?

更新:毕竟我使用的是原始脚本,没有任何修改。花了大约5个小时。而且开始很快,最后很慢。

最佳答案

我会添加:

为什么你在每个循环中创建一个新的连接并关闭它嘿!!!

也许您可以专门为 UPDATE 使用 db.autocommit(False) 并为每 100 行或其他内容执行 db.commit() ;

和 Alin Purcaru 一样,您也应该做一些基准测试。

希望这可以帮助:)

关于python - 如何在生产 MySQL 数据库上更新 400k 行并且不杀死它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3966146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com