【问题标题】:Out of memory Error while writing file around 2 GB Vertx写入大约 2 GB Vertx 的文件时出现内存不足错误
【发布时间】:2020-09-22 06:06:00
【问题描述】:

我正在尝试将文件从一个位置上传到另一个位置,文件大小可以达到 5GB,首先我尝试在本地使用 vertx 从一个位置写入另一个位置。

我正在读取文件并将其写入另一个位置,我添加了代码 sn-p,但出现内存不足错误。任何人都可以提出更好的解决方案。

这里是代码 sn-p :-

vertx.fileSystem().readFile(fileToPut,readHandler -> {
                       if (readHandler.succeeded()){
                           vertx.fileSystem().writeFile("C:\\Users\\xyz\\Desktop\\abc\\files",readHandler.result(),writeHandler -> {
                              if (writeHandler.succeeded()){
                                  log.info("file is successfully written");
                                  blockingHandler.complete();
                              } else {
                                  blockingHandler.fail(writeHandler.cause());
                              }
                           });

                       } else {
                           log.error("");
                           blockingHandler.fail(readHandler.cause());
                       }
                    });

                },resultHandler -> {
                    if (resultHandler.succeeded()){
                        log.debug("Blocking call succeed");
                    } else {
                        log.error("Error in blocking call : ",resultHandler.cause());
                    }
                });

错误日志:-

java.lang.OutOfMemoryError: Java heap space
    at io.netty.util.internal.PlatformDependent.allocateUninitializedArray(PlatformDependent.java:281) ~[netty-common-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.buffer.UnpooledUnsafeHeapByteBuf.allocateArray(UnpooledUnsafeHeapByteBuf.java:39) ~[netty-buffer-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf.allocateArray(UnpooledByteBufAllocator.java:144) ~[netty-buffer-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.buffer.UnpooledHeapByteBuf.<init>(UnpooledHeapByteBuf.java:59) ~[netty-buffer-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.buffer.UnpooledUnsafeHeapByteBuf.<init>(UnpooledUnsafeHeapByteBuf.java:34) ~[netty-buffer-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf.<init>(UnpooledByteBufAllocator.java:139) ~[netty-buffer-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.buffer.UnpooledByteBufAllocator.newHeapBuffer(UnpooledByteBufAllocator.java:82) ~[netty-buffer-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.buffer.AbstractByteBufAllocator.heapBuffer(AbstractByteBufAllocator.java:168) ~[netty-buffer-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.buffer.Unpooled.buffer(Unpooled.java:136) ~[netty-buffer-4.1.49.Final.jar:4.1.49.Final]
    at io.vertx.core.buffer.impl.BufferImpl.<init>(BufferImpl.java:44) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.buffer.impl.BufferFactoryImpl.buffer(BufferFactoryImpl.java:49) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.buffer.Buffer.buffer(Buffer.java:94) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.file.impl.FileSystemImpl$16.perform(FileSystemImpl.java:862) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.file.impl.FileSystemImpl$16.perform(FileSystemImpl.java:857) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.file.impl.FileSystemImpl$BlockingAction.handle(FileSystemImpl.java:971) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.file.impl.FileSystemImpl$BlockingAction.handle(FileSystemImpl.java:951) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$2(ContextImpl.java:313) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.impl.ContextImpl$$Lambda$175/0x000000084027b440.run(Unknown Source) ~[?:?]
    at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76) ~[vertx-core-3.9.1.jar:3.9.1]
    at io.vertx.core.impl.TaskQueue$$Lambda$151/0x0000000840255c40.run(Unknown Source) ~[?:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.49.Final.jar:4.1.49.Final]
    at java.lang.Thread.run(Thread.java:834) [?:?]

【问题讨论】:

    标签: file vert.x


    【解决方案1】:

    readFile 方法将整个文件加载到内存中,这就是为什么你会得到带有大文件的OutOfMemoryError

    Vert.x FileSystem API 有一个您应该使用的 copy 方法:

    FileSystem fs = vertx.fileSystem();
    
    // Copy file from foo.txt to bar.txt
    fs.copy("foo.txt", "bar.txt", res -> {
      if (res.succeeded()) {
        // Copied ok!
      } else {
        // Something went wrong
      }
    });
    

    【讨论】:

    • 复制是工作文件,但我的用例是我必须获取文件并传递到另一台服务器,这可能需要一些时间才能上传到服务器上,我无法在这里阻止事件循环,所以我尝试创建了作业,但仍然在本地数据存储上复制大约 5 GB 的文件需要时间
    • 我可以同时收到许多超过 3 4 gb 的文件请求
    • 问题中的 sn-p/stacktrace 显示复制的代码/错误。如果您在上传时遇到问题,请使用HttpClientWebClient 代码更新您的问题。
    猜你喜欢
    • 2021-04-23
    • 2012-09-16
    • 2011-11-04
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多