当前位置: 首页 > 面试题库 >

有没有针对Java在大型目录上行走时性能较差的解决方法?

陆信瑞
2023-03-14
问题内容

我正在尝试一次处理一个通过网络存储的文件。由于没有缓冲,因此文件读取速度很快。我的问题是只列出文件夹中的目录。在许多文件夹中,每个文件夹至少有1万个文件。

由于File.list()返回一个数组而不是可迭代的数组,因此性能非常慢。Java退出并收集文件夹中的所有名称,然后将其打包到数组中,然后再返回。

有关此错误的条目是http://bugs.sun.com/view_bug.do;jsessionid=db7fcf25bcce13541c4289edeb4?bug_id=4285834,但没有解决方法。他们只是说JDK7已修复。

几个问题:

  1. 是否有人可以解决此性能瓶颈?
  2. 我在努力实现不可能吗?即使只是遍历目录,性能仍然会很差吗?
  3. 我可以使用具有此功能的beta JDK7构建而不必在其上构建我的整个项目吗?

问题答案:

尽管不是很漂亮,但我还是通过在启动我的应用程序之前将dir / ls的输出传递到文件中并传入文件名来解决此类问题。

如果您需要在应用程序中执行此操作,则可以只使用system.exec(),但这会带来一些麻烦。

你问。第一种形式将非常快,第二种形式也将非常快。

确保对每行执行一项(裸露,无装饰,无图形),所选命令的完整路径和递归选项。

编辑:

仅仅30分钟就可以得到目录清单,哇。

令我惊讶的是,如果使用exec(),则可以将其标准输出重定向到管道中,而不是将其写入文件中。

如果这样做,则应立即开始获取文件,并能够在命令完成之前开始处理。

交互实际上可能会使事情变慢,但可能不会—您可以尝试一下。

哇,我只是为您找到.exec命令的语法,并偶然发现了它,可能正是您想要的(它使用exec和“
ls”列出了一个目录,并将结果通过管道传递到您的程序中进行处理):
好的链接在回溯中(Jörg在评论中提供了从Oracle打破的Sun
替代此)


无论如何,这个想法很简单,但是正确编写代码却很烦人。我会去窃取互联网上的一些代码,然后将它们破解-brb

/ **
 *注意:仅将此作为最后的选择!它特定于Windows,甚至
 *这不是一个好的解决方案,但是应该很快。
 * 
 *要使用它,扩展FileProcessor并使用列表调用processFiles(“ ...”)
 *选项,如果您希望它们像/ s ...我强烈建议/ b
 * 
 *覆盖processFile,它将为输出的每一行调用一次。
 * /
导入java.io. *;

公共抽象类FileProcessor
{
   公共无效processFiles(String dirOptions)
   {
      处理theProcess = null;
      BufferedReader inStream = null;

      //调用Hello类
      尝试
      {
          theProcess = Runtime.getRuntime()。exec(“ cmd / c dir” + dirOptions);
      }
      catch(IOException e)
      {
         System.err.println(“ exec()方法错误”);
         e.printStackTrace();  
      }

      //从被调用程序的标准输出流中读取
      尝试
      {
         inStream = new BufferedReader(
                                新的InputStreamReader(theProcess.getInputStream()));  
         processFile(inStream.readLine());
      }
      catch(IOException e)
      {
         System.err.println(“ inStream.readLine()发生错误”);
         e.printStackTrace();  
      }

   } //结束方法
   / **覆盖此方法-每个文件将被调用一次* /
   公共抽象无效processFile(String filename);


} //结束类

谢谢IBM的代码捐助者



 类似资料:
  • 当我在较大的数据集上运行代码时,我得到这个错误。 在1.4m问题数据集上运行代码。使用split函数会产生错误。 应用中的~\Documents\anaconda3\lib\site packages\pandas\core\series.py(self、func、convert\u dtype、args、**kwds)3589 else:3590 values=self.astype(objec

  • 问题内容: 我知道nvarchar上的连接速度较慢,因为索引比nvarchar大,每个字符使用2个字节,而int始终为4个字节。联接性能差异是否显着?有什么强烈的理由要避免加入nvarchar?我找不到有关该主题的任何MSDN文章。 问题答案: 至少8x CPU。这是将nvarchar与varchar进行比较时可测量的增加:与纯正varchar相比,unicode排序和比较规则更加复杂。 因此,假

  • 我正在尝试对由几个每日文件(每个15GB)组成的巨大数据集进行一些分析。为了更快,仅出于测试目的,我创建了一个非常小的数据集,其中包括所有相关场景。我必须分析每个用户的正确操作顺序(即类似于日志或审计)。 为了做到这一点,我定义了一个udf函数,然后应用了一个groupby。下面的代码重现了我的用例: 这给我带来了以下结果: 是不是太慢了? 我正在用一台现代笔记本电脑和康达。我使用conda na

  • 本文向大家介绍针对jQuery性能的优化方法有哪些?相关面试题,主要包含被问及针对jQuery性能的优化方法有哪些?时的应答技巧和注意事项,需要的朋友参考一下 show slide animate 等频繁修改 dom 很耗性能,可采用 jquery.transit 插件等 使用单个 id 或 class 选择器当然也是优化点咯,元素选择器是真的会卡 每次调用 $() 其实都是生成一个超大的对象,还

  • 这是应用程序。proiperties文件 spring.application.name配置服务器 server.port=8888 spring.cloud.config.server.git.uri=file:///c/用户/aadpatl/git-localconfig-repo 这是发生的异常 这是Spring boot应用程序 Pom.xml 请给我一个解决方案

  • 我已经在SO上浏览了近10篇类似的帖子,但我仍然对我得到的结果感到困惑:在42K文档集合和19条记录集合之间的单个$查找聚合上,在外部字段上进行排序需要5秒。也就是798K的总向量积。 不幸的是,在这里,非规范化不是一个很好的选择,因为“to”集合中的文档被大量共享,并且在进行更改时需要在整个数据库中进行大量更新。 话虽如此,我似乎不明白为什么接下来要花这么长时间。我觉得我一定做错了什么。 上下文