【问题标题】:Jclouds swift api upload object directly from inputstreamJclouds swift api直接从输入流上传对象
【发布时间】:2015-01-14 10:59:37
【问题描述】:

下面的sn -p 将文件上传到对象存储没有任何问题

public void uploadObjectFromStream(String container, String name, InputStream stream) {
    SwiftApi swiftApi = getApi();
    createContainerIfAbsent(container, swiftApi);
    ObjectApi objectApi = swiftApi.getObjectApiForRegionAndContainer(REGION, container);
    Payload payload = new InputStreamPayload(stream);
    objectApi.put(name, payload, PutOptions.Builder.metadata(ImmutableMap.of("X-Object-Meta-key1", "value3", "X-Object-Meta-key2", "test"))); // test
}

如果我尝试上传 ~10Mb 文件,我会收到错误

o.j.h.i.HttpWire [SLF4JLogger.java:56] over limit 10485760/262144: wrote temp file
java.lang.OutOfMemoryError: Java heap space

问题是我是否可以将对象从输入流上传到对象存储而不将流保存在应用程序内存或文件系统中。

【问题讨论】:

  • 你的java配置了多少堆?另外,您使用的是哪个版本的 jclouds?
  • 我用'-Xmx 1024m'配置了tomcat catalina.sh。我发现 jcloud 的代码 sn-p 没有引起问题。我在单独的项目中运行代码,它在几秒钟内复制了 1Gb 文件流。我明天会编辑问题
  • jclouds 不会缓冲 InputStream,除非您启用线路日志记录。通常,除非您正在调试问题,否则应禁用此功能。

标签: swift inputstream jclouds


【解决方案1】:

jclouds 不会缓冲InputStream,除非您启用线路日志记录。通常,除非您正在调试问题,否则应禁用此功能。

【讨论】:

  • 我没有禁用日志记录。将日志级别提高到 INFO 解决了这个问题。 example
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
相关资源
最近更新 更多