我正在从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
答案 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)])