【问题标题】:App engine - Uploading a large file and parsing data from it onto the datastore应用引擎 - 上传大文件并将其中的数据解析到数据存储区
【发布时间】:2010-02-05 16:13:49
【问题描述】:

我有一个包含约 16,000 行实体信息的文件。用户应该使用 HTML 上传表单上传文件,然后系统通过逐行读取并创建然后 put()'ing 实体到数据存储区来处理此问题。

我受到 30 秒请求时间限制的限制。我使用任务队列、强制 HTML 重定向等尝试了很多不同的解决方法,但没有任何对我有用。

我正在使用强制 HTML 重定向来删除所有数据,这很有效,尽管速度很慢。 (这里的第四个答案:Delete all data for a kind in Google App Engine

我似乎无法将此应用于我的上传问题,因为我的方法必须是 POST 方法。有什么解决办法吗?示例代码将不胜感激,因为我对 Web 开发非常陌生。

【问题讨论】:

  • 您尝试了哪些任务队列解决方法,为什么它们不起作用?似乎将文件存储在 blob 中,然后从其中异步解析数据是您拥有的最佳(唯一?)选项。
  • @Will:没错。如果数据是一次性上传的,但不能一次性解析,则必须存储在某个地方,以后再分部分处理。

标签: python google-app-engine upload


【解决方案1】:

为了解决类似的问题,我将数据集存储在具有单个 TextProperty 的模型中,然后生成一个任务队列任务:

  1. 如果有剩余,则从数据存储中获取数据集。

  2. 检查数据集的长度是否

  3. 如果数据集大小大于 N,则以相同的格式将其拆分为 N 个部分并将其写入数据存储区,删除原始实体,并生成任务的新副本。

【讨论】:

  • 那么单个 TextProperty 真正包含什么?我目前正在这样做以获取上传的文件: ftmp=unicode(self.request.get('myfile'),'utf-16') file=ftmp.splitlines() # 现在我有了所有行的列表在文件中。您是否建议我将 ftmp(我认为应该是一个字符串(?),其中包含一大块文件的内容)存储在单个 TextProperty 中?
  • 另外,当我尝试将 () ftmp 放入 TextProperty 时,我得到了这个。 RequestTooLargeError:对 API 调用 datastore_v3.Put() 的请求太大。
  • 就我而言,我将从 Flickr 接收到的数据从 XML 转换为 CSV 格式的格式,其中仅包含我实际想要保存的数据,但如果您正在处理已经很好的数据,则存储纯文本格式化的数据集可能效果更好。 RequestTooLargeError 表示您的初始实体大于 1MB;您可能希望在初始处理程序中将其拆分为更小的块。
【解决方案2】:

如果您这样做是为了批量加载数据,为什么不使用the bulk loader

如果您需要非管理员用户可以访问该界面,那么,按照建议,您需要将文件分成合适大小的块(通过每块 n 行)将它们放入数据存储区,然后开始处理他们每个人的任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2013-08-23
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多