- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一种强大和快速的方式来处理谷歌应用程序引擎中的大文件。
它的工作原理如下(最后简化了工作流):
客户发送一个csv文件,我们的服务器将逐行处理。
文件上传后,将在ndb数据存储中添加一个条目,其中包含csv名称、文件路径(到google存储)和一些基本信息。然后,创建一个称为“预处理”的任务。
预处理任务将在csv文件的所有行(可能是数百万行)上循环,并将每个行的ndb条目添加到Uploads
模型中,其中包含csv id、要提取/处理的行、要提取/处理的数据以及该行是否已开始处理并结束处理(“正在处理”、“已完成”)的某些指标(布尔值)。
预处理任务结束后,它会将信息更新到客户端“将处理XXX行”
呼叫UploadEntries
Uploads.next()
方法将:
搜索next
和UploadEntries
为false的is_treating
,
将在redis数据存储中为找到的下一行添加任务。(使用Redis数据存储是因为这里的工作是在非Google管理的服务器上进行的)
还将在任务is_done
中创建一个新条目(该任务在5分钟后运行,并检查7)是否已正确执行如果没有,则认为Redis/外部服务器已失败,并执行与7相同的操作,但没有结果(“错误”)。
然后,它将该条目的Process-healthcheck
更新为True。
外部服务器将处理数据,并通过向服务器上的端点发出POST请求来返回结果。
该端点更新数据存储中的UploadEntries.is_treating
条目(包括“UploadEntries
”和“is_treating
”),并调用is_done
开始下一行。
在uploads.next中,搜索下一个条目时不返回任何内容,我认为该文件将被最终处理,并调用任务Uploads.next()
,该任务将用处理过的数据重建csv,并将其返回给客户。
有几件事要记住:
真正起作用的服务器不在google appengine中,这就是为什么我不得不提出redis。
当前的处理方式使我可以灵活处理并行条目的数量:在5)中,post-process
方法包含一个Uploads.next()
参数,让我并行搜索limit
进程。可以是1,5,20,50。
我不能直接将n
任务中的所有行添加到Redis,因为在这种情况下,下一个客户将不得不等待第一个文件完成处理,而这将占用太长时间
但这个系统有各种各样的问题,这就是我求助于你的原因:
有时,这个系统速度太快,以至于数据存储尚未正确更新,调用pre-processing
时,返回的条目已在处理中(只是Uploads.next()
尚未推送到数据库)
Redis或我的服务器(我不知道)有时会丢失任务,或者处理后没有发出POST请求,所以任务永远不会转到entry.is_treating = True
这就是为什么我必须实现一个healcheck系统,以确保无论发生什么,都能正确地处理该行。这有一个双重优势:任务的名称包含csv ID和行使每个文件都是唯一的。如果数据存储不是最新的并且相同的任务被运行两次,那么HealthChIPT的创建将失败,因为相同的名称已经存在,让我知道有一个并发问题,所以我忽略了该任务,因为这意味着数据存储还没有更新。
我最初考虑在一个独立的进程中逐行运行文件,但这有一个很大的缺点,就是不能并行运行多行此外,对于专用目标,google将任务的运行时间限制为24小时(不是默认值),当文件非常大时,它可以运行超过24小时。
作为参考,如果有帮助的话,我将使用Python
为了简化工作流程,以下是我试图以最好的方式实现的目标:
处理一个大文件,运行多个并行进程,每行一个。
使用redis将工作发送到外部服务器。完成后,外部服务器通过POST请求将结果返回给主服务器
然后主服务器更新关于该行的信息,并转到下一行
如果有人能有更好的方法来做这件事,我会非常感激的我真的相信我不是第一个做这种工作的人,我很肯定我做得不对。
(我相信Stackoverflow是Stack Exchange中发布此类问题的最佳部分,因为它是一个算法问题,但也有可能我没有看到一个更好的网络如果是的话,我很抱歉)。
最佳答案
真正工作的服务器不在google appengine中
你考虑过用Google Cloud Dataflow来处理大文件吗?
它是一个托管服务,将为您处理文件拆分和处理。
基于最初的想法,这里有一个概要过程:
用户使用signed urls或blobstore API将文件直接上传到google云存储
appengine的请求启动一个小型计算引擎实例,该实例启动一个阻塞请求(BlockingDataflowPipelineRunner
)以启动数据流任务。(由于沙箱和阻塞I/O问题,恐怕它需要是一个计算实例)。
数据流任务完成后,计算引擎实例将被解除阻止,并将消息发送到pubsub。
pubsub消息调用appengine服务上的webhook,该webhook将任务状态从“进行中”更改为“完成”,以便用户可以获取其结果。
关于python - 如何在GAE上处理大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41014995/
在 GAE 中,我有一个应用程序将文件存储在 GAE blobstore 服务中。数据存储后,还应将其发送到未部署在 GAE 上的外部 Web 服务。我使用Java。 我的第一个想法是使用 JAX-R
我想找到一个用于验证用户、存储用户的 webapp 框架 并且具有jquery的ajax效果, 那么,你知道这个简单的框架吗? 谢谢 喜欢这个页面:http: //digu.com/reg 最佳答案
为了重新部署 GAE 应用程序,我目前必须在我用于部署的系统上安装 GAE 部署工具。虽然这个过程相对简单,但部署过程是一个手动过程,不能在防火墙后运行,并且部署工具必须安装在每台将用于更新 GAE
This链接显示 GAE 不支持开发服务器上的 cron 作业。那么我的其他选择是什么? 当用户的帐户截止日期已到时,我需要向他们发送电子邮件。 最佳答案 使用本地 cron 服务,并编写一个使用 c
我在运行 Maven GAE Plugin 的 gae:debug 目标时遇到问题.我收到的错误如下。有什么想法吗? 我用“mvn gae:debug”运行它。 [INFO] Packaging we
Google 刚刚宣布支持 App Engine 的 PHP 运行时。我有一个使用 Java 运行时开发的应用程序,它利用了 native App Engine 数据存储区。它目前用作移动客户端的后端
是否有一些前端允许管理员从 Google 应用引擎数据存储区插入、更新、删除记录以及创建修改和删除表,就像您在 mysql 上使用 phpMyAdmin 所做的那样??? 最佳答案 Google Ap
我正在以 GAE 为优势实现 PPO。以下代码是我根据OpenAI的基线实现计算GAE和返回的方式。 advantages = np.zeros_like(rewards) last_adv = 0
这是一个[python代码][1],我想知道它是否也可以用于GAE Java(当代码迁移时)。所以问题是,下面的 python 代码是否可以转换为 Java,而无需任何 Java 所没有的 pytho
当在 GAE 中收到一个 http 帖子时,我从另一个服务器下载一个 txt 文件,进行一些解析,然后返回信息。但是,当我更新这个 txt 文件并尝试通过 GAE 访问它时,似乎有延迟。这是一步一步的
当我运行 gae:run 时,它成功构建 jar 并启动服务器。但看起来服务器没有完全启动,因为我无法转到请求的页面。 当我使用 IDE(不是 maven gae 插件)和由 maven gae 插件
我知道有这样的插件可以在 vim 中调试 python:https://github.com/joonty/vdebug 我正在努力寻找调试 GAE 应用程序的方法,这可能吗?如果是这样,我应该采取什
我在 GAE 上部署了一个 webapp2 python 应用程序。有什么方法可以让我从 GAE 控制台探索源代码或更改项目文件。如果我只想更新已部署的应用程序上的单个 .py 文件而不是再次部署整个
我有一个 Google App 引擎应用程序,我希望它的工作方式有所不同,具体取决于它是在我的本地开发环境中运行(即使用 dev_appserver.py)还是在实际的 GAE 云中运行。 目前,我使
阅读 GAE NDB 数据存储的新文档: https://cloud.google.com/appengine/docs/python/ndb/modelclass#class_methods get
今天我第一次上传我的应用程序,当第一个请求进入以触发应用程序初始化时,它失败了。我已经在 Google GAE DEV 服务器上本地测试了所有内容,Google DEV 服务器和真正的 GAE 环境之
我正在使用 GAE 构建应用程序,并想为此使用 Django。哪个“补丁”更好? app-engine-patch 还是 django-gae-helpers?我指的是它们的功能和 future (其
使用 Google App Engine 标准 Python 2.7,我的dispatch.yaml 中有一个路径来指定“*/flex/*”类型的所有网址以路由到 Flex 服务。 调度.yaml调度
我需要一份关于使用 Flex+BlazeDS+Spring+GAE 的可读教程(在 GAE 数据存储中存储多个表)。有这样的吗? 最佳答案 你必须一步一步来: http://www.springsou
我们要重复 spring-boot-sample-gae 的指令一步一步,但我们仍然无法创建 WAR 文件,并出现以下错误消息: [错误] 无法在项目 gae-demo 上执行目标:无法解析项目 or
我是一名优秀的程序员,十分优秀!