我正在使用一个系统导入带有数据的预生成SQL文件,以构建PostGIS栅格表。创建SQL文件的步骤似乎运行良好,我可以手动导入SQL文件,但是自动代码在处理过程中会暂停并且永远不会干净退出。
有关的导入过程以前在以前的运行中已经起作用。从那时到现在的主要变化是从使用单独的线程一次处理多个运行切换到使用Python多处理模块进行处理。但是,导入过程在执行了多处理的情况下工作了很短的时间,我不确定到底是什么更改阻止了它的正常工作。
以下方法包含所有与导入处理相关的代码。该函数由处理过程管理的父对象调用。该函数在父对象的包装函数中调用,该包装对象由Python的multiprocessing.Process#start生成。参数meta和parent是一个字典,分别包含导入和父对象实例所需的信息。
用于导入的SQL文件是在上一步中生成的,该步骤还使用Python子处理对GeoTIFF文件执行raster2pgsql命令。 GeoTIFF约为1.5GB。
def importSQL(meta, parent):
rasterId = meta['rasterId']
parent.conn.execute(queries.update_raster_state, ("Importing SQL", rasterId))
sqlFileName = meta['sqlFileName']
env = os.environ.copy()
env["PGPASSWORD"] = config.dbPassword()
#Import SQL file
log.info("importRaster#importSQL: Importing SQL to spatial table...")
psql = subprocess.Popen(("psql", "-f", sqlFileName, "-U", config.dbUser(), config.dbName()), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
error = False
for errorLn in psql.stderr:
if "ERROR" in errorLn:
error = True
log.error(errorLn)
#psql.wait()
#Delete SQL file after complete
log.info("importRaster#importSQL: Cleaning directories.")
if os.path.exists(sqlFileName):
os.remove(sqlFileName)
return meta, not error
正常运行时,SQL导入将运行一段时间,然后清理目录阶段将发布,并且该函数将正确返回。从导入中还将创建一个新表。现在,该过程永不退出。我在处理过程中观察了最上面的情况,确实有一个postgres进程在大约75%的使用率下运行了几分钟,然后大概是命令完成了,然后处理下降了。但是,在最先进行处理后,该过程仍不会继续进行到清理目录阶段,并且对数据库的检查显示未创建新表。