我有一个 oracle 服务器,我需要使用 python 将数据提取到文件中。这些文件被下游系统用作输入。
很少有技术细节: Oracle 和 Python 在不同的服务器上运行。该数据库是客户端托管的,而所有脚本都在 AWS RHEL EC2 服务器上运行。此屏幕截图中突出显示了 EC2 实例的详细信息。.
我的方法 为此,我选择 Python 的 Pyodbc 库来连接到远程 Oracle 客户端并使用 SQL 查询提取数据。下面是根据提供的 SQL 查询获取数据的代码摘录。
def fetch_data_to_file(self,curr,query,dataset):
try:
self.logger.info('Executing query: {}'.format(query))
start = time.time()
curr.execute(query)
query_time = time.time()-start
start = time.time()
rowcount=0
with open(dataset,'a+') as f:
writer = csv.writer(f,delimiter='|')
writer.writerow([i[0] for i in curr.description])
self.logger.info('Writing file: {}'.format(dataset))
while True:
rows = curr.fetchmany(self.batch_limit)
self.logger.info('Writing {} rows'.format(self.batch_limit))
rowcount+=len(rows)
if not rows:
break
self.timer.info('{} Query Execution Time: {} seconds'.format(dataset,query_time))
self.timer.info('{} File Writing Time: {} seconds. at {} rows/second'.format(dataset,time.time()-start,int(rowcount / (time.time()-start))))
self.logger.info("File written.")
except Exception as e:
self.error.info("Error in fetching data.Error: {}".format(e))
raise SystemExit(1)
我正在提取的数据集接近 8GB 未压缩大小(返回接近 3500 万行)。在我的 EC2 服务器上下载文件需要大约 1.5 个小时的代码。我测试了 batch_limits 的多种变体,发现 1Million - 2Million 是批量下载数据的最佳大小,但是我不确定是否还有其他方法可以更有效地确定我的批量大小应该是多少。
我还研究了什么 我在网上寻找使用 python 将大型数据集写入文件的方法,许多人建议使用 Pandas。我试图弄清楚这一点,但没有这样做。此外,在将数据提取到文件时保留数据及其数据类型也很重要。
我的问题是:有什么我可以做的更好来让这段代码更有效率吗?Python是最适合这个的语言吗?(请注意,无论我选择什么语言,我都需要能够使工作自动化。由于我公司的内部定价挑战,在这一点上寻找许可库有点困难)。