通过其他方式(SQL和Python)优化代码

时间:2019-03-29 19:48:24

标签: python sql

我不是繁重的编码开发人员,但是我有这个问题 我有一个ID数据集-时间序列-SQL上的速度

我想将基于ID唯一值的数据集划分为1700个CSV文件(ID的唯一编号)

当我运行以下代码时,Windows停止工作。我需要通过动态SQL或其他方式来做相同的事情。

P.S。数据库是3亿行

import pyodbc    
import numpy as np    
import pandas as pd     
db = pyodbc.connect("Driver={SQL Server Native Client 11.0};" "Server=ServerName;""Database;""Trusted_Connection=yes;")     
df = pd.read_sql_query("SELECT* from DataBase", db)     
ID = df['ID'].unique()     
dfs={}     
SR=()    
for i, S in enumerate(ID):     
    dfs[i]=df[df['ID']==S]    
    filename=S+'.CSV'    
    df.to_csv(filename)  

2 个答案:

答案 0 :(得分:0)

我太新了,无法发表评论,对不起,如果下面的代码不起作用。如果您有任何问题或不了解如何修改此代码以使其适合您的答案,请对此答案发表评论。 像您对问题的评论一样,我建议您:

-获取所有唯一的列名称

-通过遍历唯一ID来查询数据库的较小块

import pandas as pd     
db = pyodbc.connect("Driver={SQL Server Native Client 11.0};" "Server=ServerName;""Database;""Trusted_Connection=yes;")     
df_ID = pd.read_sql_query("SELECT Distinct ['ID'] from DataBase", chunksize=1000, db)     
ID = df_ID['ID'].tolist()     

for i in ID:     
    df = pd.read_sql_query("SELECT * from DataBase Where ['ID'] = " + i, db)
    filename=str(i) +'.CSV'    
    df.to_csv(filename)  

我使用sqlalchemy对SQL DB运行查询,但是我想我已经正确了。

答案 1 :(得分:0)

您说您的数据库中有3亿行,但是我不确定在ID列上执行唯一操作时最终会获得多少行?

我假设3亿。您可以对所有1700个已划分的数据帧制作一个字典,然后从那里保存所需的数据帧。

import pyodbc    
import numpy as np    
import pandas as pd     
db = pyodbc.connect("Driver={SQL Server Native Client 11.0};" "Server=ServerName;""Database;""Trusted_Connection=yes;")     
df = pd.read_sql_query("SELECT* from DataBase", db)     
ID = df['ID'].unique()  
ID=ID.assign(divider=ID.index//1700)
d = {y:x for y,x in ID.groupby('divider')}
#save first dataframe
d[0].to_csv('first.csv',columns=['ID'],index=False)

这应该为您节省一些内存。