SQL cx_Oracle 中循环中的大型数据集的字典追加
SQL Dictionary Appending for Large Datasets in a Loop in cx_Oracle
我正在尝试将字典附加在一起,然后使用“from_dict”从 cx_Oracle 获取最终返回的数据,因为我听说从 [=27] 附加每个返回的行效率更高=].但是,我的循环仍然需要很长时间(结束循环 returns 一个非常大的数据库,每个循环获取一个 I.D 的数据。每个 returns ~ 12,000 行 I.D.-循环中有 700 多个 I.D.s)。我如何利用“from_dict”来加快速度?我认为这不是最有效的方法,因为我现在已经编写了代码。有什么建议么?谢谢。
有没有更高效的方法?使用 concat
而不是 append
?
for iteration, c in enumerate(l, start = 1):
total = len(l)
data['SP_ID'] = c
data['BEGIN_DATE'] = BEGIN_DATE
print("Getting consumption data for service point I.D.:", c, " ---->", iteration, "of", total)
cursor.arraysize = 1000000
cursor.prefetchrows = 2
cursor.execute(sql, data)
cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args))
df_row = cursor.fetchall()
if len(df_row) == 0:
pass
else:
a = {k: [d[k] for d in df_row] for k in df_row[0]} # Here is where I combine dictionaries, but this is for only dataset pulling from SQL.I want to combine all the dictionaries from each loop to increase efficiency.
AMI_data = pd.DataFrame.from_dict(a)
#AMI.append(AMI_data)
#final_AMI_data = pd.concat(AMI)
# final_data.dropna(inplace = True)
# UPDATED
final_AMI_data = pd.DataFrame()
for iteration, c in enumerate(l, start = 1):
total = len(l)
data['SP_ID'] = c
data['BEGIN_DATE'] = BEGIN_DATE
print("Getting consumption data for service point I.D.:", c, " ---->", iteration, "of", total)
cursor.arraysize = 1000000
cursor.prefetchrows = 2
cursor.execute(sql, data)
cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args))
df_row = cursor.fetchall()
if len(df_row) == 0:
pass
else:
AMI_data = pd.DataFrame.from_records(df_row)
final_AMI_data.append(AMI_data, ignore_index = False)
# final_data.dropna(inplace = True)
如果您已经拥有字典式游标工厂,则无需重新创建字典。 (顺便说一句,请参阅 了解如何制作更好的。)
假设您的 df_rows
在获取所有行后看起来像这样,其中 'X' 和 'Y' 是查询结果的示例列名称:
[{'X': 'xval1', 'Y': 'yval1'},
{'X': 'xval2', 'Y': 'yval2'},
{'X': 'xval3', 'Y': 'yval3'}]
1. 然后使用 .from_records()
创建数据框:
pd.DataFrame.from_records(df_rows)
输出:
X Y
0 xval1 yval1
1 xval2 yval2
2 xval3 yval3
这样,您无需重组结果即可与 from_dict()
一起使用。
2. 如果您想继续将每组 12,000 个结果添加到同一个 DataFrame,请使用 DataFrame.append()
和 ignore_index=True
继续添加每个现有数据框的新结果组。
最好只是附加到你的数据框中,而不是创建一个越来越大的字典来最终创建一个 df。
如果不清楚,删除 这两行 else
:
a = {k: [d[k] for d in df_row] for k in df_row[0]}
AMI_data = pd.DataFrame.from_dict(a)
并将其替换为:
AMI_data = pd.DataFrame.from_records(df_row)
# and then to add it to your final:
final_AMI_data.append(AMI_data, ignore_index=True)
我正在尝试将字典附加在一起,然后使用“from_dict”从 cx_Oracle 获取最终返回的数据,因为我听说从 [=27] 附加每个返回的行效率更高=].但是,我的循环仍然需要很长时间(结束循环 returns 一个非常大的数据库,每个循环获取一个 I.D 的数据。每个 returns ~ 12,000 行 I.D.-循环中有 700 多个 I.D.s)。我如何利用“from_dict”来加快速度?我认为这不是最有效的方法,因为我现在已经编写了代码。有什么建议么?谢谢。
有没有更高效的方法?使用 concat
而不是 append
?
for iteration, c in enumerate(l, start = 1):
total = len(l)
data['SP_ID'] = c
data['BEGIN_DATE'] = BEGIN_DATE
print("Getting consumption data for service point I.D.:", c, " ---->", iteration, "of", total)
cursor.arraysize = 1000000
cursor.prefetchrows = 2
cursor.execute(sql, data)
cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args))
df_row = cursor.fetchall()
if len(df_row) == 0:
pass
else:
a = {k: [d[k] for d in df_row] for k in df_row[0]} # Here is where I combine dictionaries, but this is for only dataset pulling from SQL.I want to combine all the dictionaries from each loop to increase efficiency.
AMI_data = pd.DataFrame.from_dict(a)
#AMI.append(AMI_data)
#final_AMI_data = pd.concat(AMI)
# final_data.dropna(inplace = True)
# UPDATED
final_AMI_data = pd.DataFrame()
for iteration, c in enumerate(l, start = 1):
total = len(l)
data['SP_ID'] = c
data['BEGIN_DATE'] = BEGIN_DATE
print("Getting consumption data for service point I.D.:", c, " ---->", iteration, "of", total)
cursor.arraysize = 1000000
cursor.prefetchrows = 2
cursor.execute(sql, data)
cursor.rowfactory = lambda *args: dict(zip([d[0] for d in cursor.description], args))
df_row = cursor.fetchall()
if len(df_row) == 0:
pass
else:
AMI_data = pd.DataFrame.from_records(df_row)
final_AMI_data.append(AMI_data, ignore_index = False)
# final_data.dropna(inplace = True)
如果您已经拥有字典式游标工厂,则无需重新创建字典。 (顺便说一句,请参阅
假设您的 df_rows
在获取所有行后看起来像这样,其中 'X' 和 'Y' 是查询结果的示例列名称:
[{'X': 'xval1', 'Y': 'yval1'},
{'X': 'xval2', 'Y': 'yval2'},
{'X': 'xval3', 'Y': 'yval3'}]
1. 然后使用 .from_records()
创建数据框:
pd.DataFrame.from_records(df_rows)
输出:
X Y
0 xval1 yval1
1 xval2 yval2
2 xval3 yval3
这样,您无需重组结果即可与 from_dict()
一起使用。
2. 如果您想继续将每组 12,000 个结果添加到同一个 DataFrame,请使用 DataFrame.append()
和 ignore_index=True
继续添加每个现有数据框的新结果组。
最好只是附加到你的数据框中,而不是创建一个越来越大的字典来最终创建一个 df。
如果不清楚,删除 这两行 else
:
a = {k: [d[k] for d in df_row] for k in df_row[0]}
AMI_data = pd.DataFrame.from_dict(a)
并将其替换为:
AMI_data = pd.DataFrame.from_records(df_row)
# and then to add it to your final:
final_AMI_data.append(AMI_data, ignore_index=True)