Python实现高效导入Excel数据到ClickHouse

设计一个从Excel文件导入Clickhouse表的程序流程,并用Python来实现。单进程读取Excel文件,分批读取,每批读取1000条,使用INSERT的语句带多组值来写入数据库,比如100组值,可以创建多个列表来缓存这些插入数据库的语句,实现连续读取数据不中断,创建单个进程来读取顺序这些列表来写入表,读取完列表的数据之后,清空列表以便下一次再写入插入数据库的依据,我希望读取和写入数据库的操作,尽量减少中间锁对象和等待完成的时间,以最高的性能运行。

import pandas as pd
import queue
import threading
import clickhouse_connect
from time import perf_counter

class ExcelToClickHouse:
    def __init__(self, excel_path, ch_host, ch_database, ch_table, batch_size=1000, insert_batch=100):
        """
        :param excel_path: Excel文件路径
        :param ch_host: ClickHouse服务器地址
        :param ch_database: 数据库名
        :param ch_table: 表名
        :param batch_size: 每批读取行数
        :param insert_batch: 每次插入的批次数
        """
        self.excel_path = excel_path
        self.ch_client = clickhouse_connect.get_client(host=ch_host, database=ch_database)
        self.ch_table = ch_table
        self.batch_size = batch_size
        self.insert_batch = insert_batch
        self.data_queue = queue.Queue(maxsize=10)  # 控制内存使用
        self.producer_done = threading.Event()
        self.total_rows = 0
        self.inserted_rows = 0
        self.lock = threading.Lock()

    def _producer(self):
        """生产者:读取Excel并分批次放入队列"""
        try:
            # 首次读取获取列名
            df = pd.read_excel(self.excel_path)
            columns = df.columns.tolist()
            total_rows = len(df)
            for start in range(0, total_rows, self.batch_size):
                chunk = df.iloc[start:start+self.batch_size]
                data = [tuple(row

你可能感兴趣的:(python,开发语言,clickhouse,excel,pandas)