【发布时间】:2019-10-02 09:31:37
【问题描述】:
我有一个 oracle 服务器,我需要使用 python 将数据提取到文件中。这些文件被下游系统用作输入。
一些技术细节: Oracle 和 Python 在不同的服务器上运行。该数据库是客户端托管的,而所有脚本都在 AWS RHEL EC2 服务器上运行。此屏幕截图中突出显示了 EC2 实例的详细信息。 .
我的方法 为此,我选择 Python 的 Pyodbc 库连接到远程 Oracle 客户端并使用 SQL 查询提取数据。以下是根据提供的 SQL Query 获取数据的代码摘录。
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 的多种变体进行了测试,发现 100 万 - 200 万是批量下载数据的最佳大小,但我不确定是否还有其他方法可以更有效地确定我的批量大小应该是多少。
我还研究了什么 我在网上寻找使用 python 将大型数据集写入文件的方法,许多人建议使用 Pandas。我试图弄清楚这一点,但没有这样做。此外,在将数据提取到文件时保留数据及其数据类型也很重要。
我的问题是:我可以做些什么来让这段代码更有效率? Python是最适合这个的语言吗? (请注意,无论我选择什么语言,我都需要能够自动化这些工作。由于我公司的内部定价挑战,在这一点上寻找许可库有点困难)。
【问题讨论】:
-
Pandas 有 200MB 的限制,所以它没有帮助。文件的最终目的地是什么?这些“下游系统”是否在 EC2 服务器上?这些系统是 Oracle、其他 RDBMS 还是其他什么?提取文件是 CSV 还是其他格式?
-
最后将文件馈送到多个系统,包括数据库(Redshift)和报告解决方案(Microstrategy)。并在 FTP 上发布 2 个文件,供其他供应商根据他们的要求使用。
-
由于其他使用文件的系统的设置方式,数据提取需要专门用 PIPE 分隔。我可以考虑使用不同的分隔符,但前提是绝对必要,因为这将涉及说服多个团队更改他们的模块。
-
那么文件是否写入EC2服务器真的很重要吗?因为将它们写入数据库本地并从那里分发它们可能会更有效。实际的分隔符无关紧要。只是确定它是一个分隔的文本文件,而不是(比如说)XML、JSON 或专有的东西(Excel、SQL 插入语句)。
-
@APC 我可能理解错了。您是否建议我将数据直接写入表而不是文件?类似于 ORACLE -> Redshift?
标签: python oracle performance export bulk-operations