首页 > 编程语言 >python性能调优之key-query

python性能调优之key-query

时间:2022-11-29 17:55:29浏览次数:66  
标签:count 00 python batch 000 调优 query find size

近期接触到一个性能调优的问题,需要在 mongo db 中比对大约 100G 的 csv 文件的 key 在 mongo db 中是否存在

base line

首先做一个什么优化都没有的情况下的基准测试:

batch_size = 10**4*3
find_count = 0
total = 0
exception_count = 0
begin = datetime.now()
max_size = 10**6*5

for chunk in pd.read_csv(file, header = None, chunksize=batch_size, names = ['key']):
    total += batch_size
    try:
        find_count += mycol.count_documents({'Key': {'$in': chunk.key.tolist()}})
        print('size: {:,}, find: {}, time: {}'.format(total, find_count, datetime.now() - begin))
    except:
        exception_count += 1
    
    if total > max_size:
        break

print('size: {:,}, batch_size: {:,}, time: {}'.format(total, batch_size, datetime.now() - begin))

size: 5,000,000, batch_size: 30,000, time: 0:00:44

500 万的数据,耗时 44 秒

优化一:建立索引

给 Key 栏位建立 hashed 索引:

{
    "Key": "hashed"
}

size: 5,000,000, batch_size: 30,000, time: 0:00:34

耗时 34 秒

优化二:启用 network compression

pip install zstandard
import pymongo
import urllib

myclient = pymongo.MongoClient('mongodb://{}:{}@localhost/db?authSource=admin'.format(urllib.parse.quote('root'),
    urllib.parse.quote('example')), compressors='zstd')

size: 5,000,000, batch_size: 30,000, time: 0:00:20

耗时 20 秒

优化三:同时使用 index 和 network compression

size: 5,000,000, batch_size: 30,000, time: 0:00:09

优化四:使用多线程

使用多线程,将数据读取和数据查询分开进行,提升并发效率

import pandas as pd
from queue import Queue
from threading import Thread, Lock

my_queue = Queue(maxsize=10)
num_threads = 2
lock = Lock()

def do_stuff(id, q, mycol):
    global find_count
    global exception_count
    while True:
        try:
            count = mycol.count_documents({'Key': {'$in': q.get()}})
            with lock:
                find_count += count
                print('id: {}, size: {:,}, find: {}, now: {}'.format(id, total, find_count, datetime.now() - begin))
        except:
            exception_count += 1
            print('size exception: {:,}, find: {}, now: {}'.format(batch_size, find_count, datetime.now() - begin))
        
        q.task_done()

for i in range(num_threads):
    worker = Thread(target=do_stuff, args=(i, my_queue, mycol))
    worker.setDaemon(True)
    worker.start()

for chunk in pd.read_csv(file, header = None, chunksize = batch_size, names = ['key']):
    total += batch_size
    my_queue.put(chunk.key.tolist())

    if total > max_size:
        break

my_queue.join()

print('size: {:,}, batch_size: {:,}, find: {}, exception: {}, now: {}'.format(total, batch_size, find_count, exception_count, datetime.now() - begin))

size: 5,000,000, batch_size: 30,000, time: 0:00:05

耗时 5 秒

总结

no optimization index network compression multiple thread result
v 0:00:45
v 0:00:34 1.32x
v 0:00:20 2.25x
v v 0:00:09 5x
v v v 0:00:06 7.5x

参考

标签:count,00,python,batch,000,调优,query,find,size
From: https://www.cnblogs.com/windchen/p/16936110.html

相关文章

  • python-比较两个列表中的相同元素和不同元素
    由于两个列表(List)中可能会存在重复的元素,所以我们可以将列表转化成集合(set)进行去重,然后计算交集和差集。A=['1','2','3']B=['2','4','5']##计算交集print(str(......
  • PYTHON 控制语句
    1.1if语句1.1.1if结构if条件: 代码块如果条件成立(True),则执行代码块。score=100ifscore>=90:print("优秀")1.1.2if-else结构if条件:代码......
  • 力扣240(java&python)-搜索二维矩阵 II(中等)
    题目:编写一个高效的算法来搜索 m x n 矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例......
  • 【python】locust模块_性能测试
    简介Locust是一款易于使用的分布式负载测试工具,完全基于事件,即一个locust节点也可以在一个进程中支持数千并发用户,不使用回调,通过gevent使用轻量级过程(即在自己的进程......
  • pythonfloat优雅的四舍五入
    开发中经常会有float四舍五入转int的需求,先看看浮点数直接转int的情形:无论如何float直接转int都不会四舍五入,而是直接抹去小数点。这个需求很简单,实现也很简单,看过网友的......
  • [CSS3] Container query
    https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries Usethecontainer-type propertyavalueof size, inline-size,or normal.Theseva......
  • python一键去PDF水印,只需十行代码,超级简单...
    弟弟最近要考试,临时抱佛脚在网上找了一堆学习资料复习,这不刚就来找我了,说PDF上有水印,影响阅读效果,到时候考不好就怪资料不行,气的我差点当场想把他揍一顿!算了,弟弟长......
  • python-面向对象- 实例方法,类方法,静态方法, 类属性
    名称定义方法权限调用方法实例方法第一个参数必须是示例,一般命名为self可以访问实例的属性和方法,也可以访问类的实例和方法一般通过示例调用,类也可以调用类方法......
  • Python工具箱系列(十六)
    前面介绍了对称加密算法,本文将介绍密码学中另一类重要应用:消息摘要(Digest),什么是消息摘要?简单的定义是:对一份数据,进行一个单向的Hash函数,生成一个固定长度的Hash值,这个值......
  • 拓端tecdat|Python代写中用PyTorch机器学习分类预测银行客户流失模型
    Python中用PyTorch机器学习分类预测银行客户流失模型  分类问题属于机器学习问题的类别,其中给定一组功能,任务是预测离散值。分类问题的一些常见......