【问题标题】:Failing for Larger Input Files Only: FileServiceFactory getBlobKey throws IllegalArgumentException仅对较大的输入文件失败:FileServiceFactory getBlobKey 抛出 IllegalArgumentException
【发布时间】:2013-04-15 21:14:24
【问题描述】:

我有一个将 CSV 转换为 XML 文件的 Google App Engine 应用。它适用于较小的 XML 输入,但拒绝为较大的输入 XML 完成文件。在一个长期运行(多天持续时间)的任务中,在最终确定之前多次读取 XML,并将生成的 csv 文件写入其中。我的问题与 FileServiceFactory getBlobKey throws IllegalArgumentException 不同,因为我的代码在生产和开发中都可以使用小输入文件正常工作。所以这并不是说我在关闭/完成之前忽略了写入文件。但是,当我尝试从更大的 XML 文件中读取数据时。输入 XML 文件约为 150MB,而生成的 5 个 CSV 文件集每个都小得多(可能每个 10MB)。我保留了新 csv 文件的文件 url,甚至尝试用一些静态代码关闭它们,但我只是重现了相同的错误,即

java.lang.IllegalArgumentException: creation_handle: String properties must be 500 characters or less.  Instead, use com.google.appengine.api.datastore.Text, which can store strings of any length.
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedSingleValue(DataTypeUtils.java:242)
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:207)
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:173)
    at com.google.appengine.api.datastore.Query$FilterPredicate.<init>(Query.java:900)
    at com.google.appengine.api.datastore.Query$FilterOperator.of(Query.java:75)
    at com.google.appengine.api.datastore.Query.addFilter(Query.java:351)
    at com.google.appengine.api.files.FileServiceImpl.getBlobKey(FileServiceImpl.java:329)

但我知道这不是字符串/文本数据类型的问题,因为我已经在使用类似长度的文件服务 url 来成功尝试使用较小的文件。对于我上面链接的其他 stackoverflow 帖子来说,这也不是问题。我还尝试在完成之前写最后一篇无意义的文章,以防万一它会像对另一篇文章一样有所帮助,但这没有任何区别。所以我真的没有办法调试这个......这是我的文件关闭代码不起作用。它与http://developers.google.com/appengine/docs/java/blobstore/overview#Writing_Files_to_the_Blobstore 上的 Google 操作方法示例非常相似。

log.info("closing out file 1");
try {
    //locked set to true
    FileWriteChannel fwc1 = fileService.openWriteChannel(csvFile1, true);
    fwc1.closeFinally();
} catch (IOException ioe) {ioe.printStackTrace();}

// You can't get the blob key until the file is finalized
BlobKey blobKeyCSV1 = fileService.getBlobKey(csvFile1);
log.info("csv blob storage key is:" + blobKeyCSV1.getKeyString());
csvUrls[i-1] = blobKeyCSV1.getKeyString();
break;

此时,我只想完成我的新 blob 文件,其中我有 url,但不能。我怎样才能解决这个问题,还有,可能是什么原因?同样,我的代码适用于小文件(〜60 kB),但〜150MB的输入文件失败)。感谢您就导致此问题的原因或如何解决此问题提供任何建议!另外,我的未定稿文件在被删除之前会保留多久?

【问题讨论】:

  • 见 Issue 8932 code.google.com/p/googleappengine/issues/detail?id=8932,我们正在努力。
  • 感谢 Sebastian,感谢您正在努力。但是,我认为我的问题不同,更像是这个问题:code.google.com/p/googleappengine/issues/detail?id=9035,因为我已经在我的代码中成功使用了较长的 blob 文件 url(我将它们保存在数据库中并且它们工作正常用我的代码)。我认为异常的详细描述在某种程度上具有误导性,因为似乎 FileServiceImpl.getBlobKey 中的任何故障都会导致来自 datastore.DataTypeUtils.checkSupportedSingleValue 的这条消息,我认为这是对检查代码的全面误诊。
  • 为了说明,我的新 blob 文件名长度是恒定的,但是对于较大的 blob,blob 无法最终确定。
  • 我认为这两个问题是相关的。您实际上可以完成您的文件。获取 blobKey 时会出现问题。
  • 塞巴斯蒂安,好点;我确实从定稿中没有例外。但是,为什么我仍然觉得它没有完全完成是因为最终文件没有出现在 App Engine 仪表板 Blob 查看器屏幕的最终文件列表中。

标签: java google-app-engine blobstore


【解决方案1】:

此问题是 Java MapReduce 和 Files API 中的一个错误,最近由 Google 修复。在此处阅读公告:groups.google.com/forum/#!topic/google-appengine/NmjYYLuSizo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2018-10-27
    • 2013-08-18
    • 2014-09-08
    相关资源
    最近更新 更多