使用熊猫提高性能

时间:2020-04-08 20:33:05

标签: python sql-server pandas

我正在从SQL Server读取数据,并使用数据帧将其写入.dat文件中。

记录总数为31M +或4.87GB数据。读取和写入.dat文件需要11.40秒。当前的VB系统将在6分钟内完成。

反正我可以改善脚本的性能吗?

def test_SQLPandas():
  conn = pyodbc.connect(sql, conn_str)
  df = pd.read_sql(sql, conn, chunksize=50000)
  i=1
  for data in df:
     data.to_csv('smaple.dat', sep='\t', mode='a')
     i+=1

1 个答案:

答案 0 :(得分:0)

我认为sql server是多线程的,可以响应多个同时请求。因此,我认为您应该利用多重处理的优势:

import multiprocessing as mp
use_threads=mp.cpu_count()-1
batch_size=50000
conn = pyodbc.connect(sql, conn_str)
query='''your query...
          OFFSET {} ROWS 
FETCH NEXT {} ROWS ONLY;'''

tot_rows=pd.read_sql("select count(*) as tot_rows from your_table").iloc[0,0]

def read_sql(batch):
    df = pd.read_sql(query.format(batch*batch_size, (batch+1)*batch_size), conn)

with mp.Pool(use_threads) as pool:
    dfs=pool.map(read_sql, range(tot_rows//batch_size+1))

这个想法是在SQL Server中使用offset和fetch批处理查询,并且在您的计算机上有多个进程同时请求这些批处理

然后您可以将其合并到一个表中并编写csv

pd.concat(dfs).to_csv("sample.csv")

或再次利用mp

def to_csv(input):
    df, name=input
    df.to_csv(name)

with mp.Pool(use_threads) as pool:
        pool.map(to_csv, [(df, f'sample_{i}') for i,df in enumerate(dfs)])
相关问题