我有一个在Python 3.6.3中执行以下操作的过程: 1.使用cx_Oracle(7.x)从Oracle读取数据 2.我在游标中使用了较大的块大小,即80000行。 3.在使用带有32个进程池的apply_async批量读取游标的同时,每个进程都写入一个单独的文件。 4. apply_async调用调用的函数从队列中获取数据并打开一个新文件,然后将数据写入该文件并关闭它。
我总是看到最终输出中随机丢失数据。通常是80K +行。好像其中一个进程未将数据写入文件,或者某些进程正在将较少的数据写入其单个文件。我已验证我使用len(rows)命令从数据库中读取了正确的行数,以确保在写入文件之前已读取所有数据。
代码有点像这样:
from __future__ import print_function
import cx_Oracle
import csv
import time
import datetime
from multiprocessing import Pool
from multiprocessing import Queue
pool = cx_Oracle.SessionPool(....., threaded = True)
queue1 = Queue()
def WriteRowsToFile(fname):
rows=q.get()
csvf = open(flname, 'w')
csv_writer = csv.writer(csvf)
csv_writer.writerows(rows)
csv_writer.flush()
csvf.close()
return 0
def TheBigQuery():
ctr = 0
totalrows = 0
fname='TestFile.txt'
ppool = Pool(processes=32)
conn = pool.acquire()
cursor = conn.cursor()
cursor.arraysize = 80000
cursor.execute("""
SELECT * FROM TEMP_EMP
""")
while True:
rows = cursor.fetchmany()
totalrows = totalrows + cursor.rowcount
if not rows:
break;
q.put(rows)
ctr = ctr + 1
fname = 'Testfile'+str(ctr)+'.txt'
result = ppool.apply_async(WriteRowsToFile,(fname,))
print("Total number of rows written : ")
print(totalrows)
ppool.close()
ppool.terminate()
return
TheBigQuery()
我对文件中的数据丢失感到有些惊讶,因为每个进程在每次调用时都会写入自己的文件。除非apply_async进程以某种方式将任务分配给正在忙于写入文件的进程,并且在该时间范围内,否则它不会写入新数据。如何调试并解决问题?
提示/指针将不胜感激。非常感谢。