【发布时间】:2020-07-05 21:09:08
【问题描述】:
我要下载的数据大约是 Oracle 11g 数据库中的 45,000,000 行和 38 列。
当我尝试在 python 中下载 chunksize=50000 的数据时,
DatabaseError: ORA-01555: 快照太旧
此错误总是发生在块的同一点(code(1)_at 9th session)。
但是,当我按日期分别下载相同的数据时,下载的数据没有任何错误。(代码(2))
第一次,我猜“DatabaseError: ORA-01555”这个错误是因为按chunksize 50000下载可能需要太长时间。但是一天的数据大约有 300,000 行,大于 50000 块大小。谁能告诉我你的意见?
以下是我的代码。
(1) 按块大小下载
# SQL Query
tmp = pd.read_sql_query("SELECT * FROM Database WHERE TIME_STAMP BETWEEN TO_TIMESTAMP('2019-12-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2019-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS')", con = con, chunksize = 50000)
gen = map(pd.DataFrame, tmp)
# Download by chunk
cnt = 0
flag = 0
for index, data in enumerate(gen):
if flag == 0 or index == 0:
df = pd.DataFrame(data)
flag = 1
elif index % 100 != 0:
df = pd.concat([df,pd.DataFrame(data)], axis = 0)
elif index % 100 == 0:
df = pd.concat([df,pd.DataFrame(data)], axis = 0)
cnt = cnt+1
# Save as CSV file
df.to_csv("{0}{1}{2}".format("D:\\Data",cnt,".csv"), header=True, index=False)
print("Index: ", index)
print("Shape: ", df.shape)
print("==========={}th Session Ended==============".format(cnt))
# Flush out Memory
del df
gc.collect()
flag = 0
(总是在第 9 届会议,错误出来)
(2) 按日期下载
for i in range(1,32):
print("============ 2019-12-",i," ============")
date = "2019-12-{}".format(i)
# SQL Query
tmp = pd.read_sql_query("SELECT * FROM Database WHERE TIME_STAMP BETWEEN TO_TIMESTAMP('2019-12-{} 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2019-12-{} 23:59:59', 'YYYY-MM-DD HH24:MI:SS')".format(i,i), con = con)
# Save as CSV file
tmp.to_csv("{0}{1}{2}{3}".format("D:\\","ByDate\\",date,".csv"), header=True, index=False)
# Flush out Memory
del tmp
gc.collect()
【问题讨论】: