【问题标题】:java.io.IOException: Too many open files when reading files from folder and subfolders [closed]java.io.IOException:从文件夹和子文件夹中读取文件时打开的文件过多[关闭]
【发布时间】:2019-08-29 11:36:09
【问题描述】:

我正在尝试从文件夹及其子文件夹中读取文件,但在读取某些文件后,它会抛出

java.io.IOException: 打开的文件太多

我有超过 80k 的文件需要阅读。我无法关闭文件。也许我有一个错误的方法。 请引导我走向正确的道路。谢谢 这是我的Logcat

Caused by: java.io.IOException: Too many open files
    at java.base/sun.nio.ch.IOUtil.makePipe(Native Method)
    at java.base/sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:83)
    at java.base/sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:36)
    at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:167)

代码

try (Stream<Path> filePathStream=Files.walk(Paths.get(FOLDER_PATH))) {
            filePathStream.forEach(filePath -> {
                if (Files.isRegularFile(filePath)) {

                    System.out.println(filePath.toFile().getAbsoluteFile().toString());
                    try {
                        String content = Files.readString(filePath);
                        System.out.println(filePath.getFileName());
                        JSONObject jsonObject1 = new JSONObject(content);
                        // System.out.println(file.getName());

                        HashMap yourHashMap1 = new Gson().fromJson(jsonObject1.toString(), HashMap.class);
                        request.add(new Config().client().prepareIndex("recipe_json", "default").setSource(yourHashMap1));

                    } catch (IOException ignore) {
                    }

【问题讨论】:

  • 听起来确实是错误的做法;也就是说,此错误通常来自操作系统级别的限制。
  • @MauricePerry @snr 我使用的是 Ubuntu 18.04.3,运行上面的命令会得到1614882
  • 请提供更多的堆栈跟踪行。是什么导致openSelector 被调用?
  • 您标记了 java-8,但在 java-11 中引入了 Files.readString()
  • 您发布的异常不是您发布的代码抛出的。如果您不想看到您的问题被关闭,您需要解决这个问题。在我看来,您正在泄漏套接字,而不是文件。甚至可能是选择器。

标签: java file java-11


【解决方案1】:

这个问题有几个可能的原因:

  • 您可能只是同时打开了太多文件。我不知道怎么做,因为Files.readString(filePath) 不应该泄漏。但是,我注意到您正在压制 IOException,这可能会丢掉一些重要的证据。

  • 您可能正在其他地方打开文件...或管道或套接字。也许在这里:

    request.add(new Config().client()
                            .prepareIndex("recipe_json", "default")
                            .setSource(yourHashMap1));
    

我正在使用 Elasticsearch Bulk API 并在这行代码中将文件内容添加到批量中。这违反了规则吗?

可能是的。检查 API 文档。我希望您需要“关闭”或“断开”客户端。如果你不这样做,那很可能会泄漏套接字。

【讨论】:

  • 我正在使用Elasticsearch Bulk API 并在这行代码中将文件内容添加到批量中。这违反了规则吗?
  • 你是对的。它导致了这个问题。我在评论该行后尝试过,它工作正常。但我需要此请求中的数据。我该怎么处理它?有什么想法吗?
  • 尝试使用单个 client 对象,而不是为您处理的每个文件创建一个新对象。
  • 保留一个client 解决了这个问题。谢谢。我工作了好几个小时。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多