我正在寻找一种强大而快速的方法来处理Google App Engine中的大型文件处理。
它的工作原理如下(最后的简化工作流程):
Uploads
中会添加一个条目,其中包含CSV名称,文件路径(到Google存储)以及一些基本信息。然后,创建一个任务,称为"预处理"。UploadEntries
模型,其中包含CSV ID,行,如果此行已开始处理,则结束处理(" is_treating"," is_done")Uploads.next()
。 next
方法将:
UploadEntries
和is_treating
的{{1}},is_done
中创建一个新条目(此任务在5分钟后运行并检查7)已正确执行。如果没有,它认为Redis / Outside服务器发生故障并且与7)相同,没有结果("错误"相反)。)Process-healthcheck
更新为True。UploadEntries.is_treating
条目(包括" UploadEntries
"和" is_treating
"),并致电{ {1}}开始下一行。is_done
,并将其返回到顾客。这里有一些要记住的事情:
Uploads.next()
方法包含一个post-process
参数,可以让我搜索{{1并行处理。可以是1,5,20,50。Uploads.next()
任务中的所有行添加到Redis,因为在这种情况下,下一个客户将不得不等待第一个文件完成处理,这将堆积花了太长时间但是这个系统有各种各样的问题,这就是为什么我转向你的帮助:
limit
时,返回的条目已在处理中(仅n
尚未处理)推送到数据库)pre-processing
。这就是我必须实施Healcheck系统的原因,以确保无论如何都能正确对待生产线。这有一个双重优势:该任务的名称包含csv ID和行。使每个文件唯一。如果我的数据存储区不是最新的并且同一个任务运行两次,那么运行状况检查的创建将失败,因为已存在相同的名称,让我知道存在并发问题,所以我忽略了该任务,因为它意味着数据存储尚未更新。我首先考虑在一个独立的进程中逐行运行该文件,但这有一个很大的缺点,就是无法并行运行多行。此外,Google将专用目标的运行限制为24小时(非默认值),当文件非常大时,可以运行超过24小时。
有关信息,如果有帮助,我使用 Python
为简化工作流程,以下是我尝试以最佳方式实现的目标:
如果有人有更好的方法,我真的很感激。我真的相信我不是第一个做这种工作的人,而且我很确定我做得不好。
(我相信Stackoverflow是Stack Exchange发布这类问题的最佳部分,因为它是一个算法问题,但它也有可能我没有看到更好的网络如果是的话,我很抱歉。
答案 0 :(得分:1)
执行实际工作的服务器不在Google AppEngine
之内
您是否考虑过使用Google Cloud Dataflow来处理大型文件? 它是一个托管服务,将为您处理文件拆分和处理。
基于最初的想法,这是一个大纲过程:
BlockingDataflowPipelineRunner
)以启动数据流任务。 (我担心它需要是一个计算实例,因为沙箱和阻塞I / O问题)。