【问题标题】:Process Many Files and Delete处理许多文件并删除
【发布时间】:2015-11-12 10:31:05
【问题描述】:

我已经实现了一个解决方案,它使用 Quartz 在一段时间内读取文件夹,并且对于每个文件,它都会执行一些操作并在完成时删除文件。当我的目录中没有数千个文件时,它很顺利。

getFiles(config.getString("input")) match {
  case Some(files) =>
    files.foreach { file =>
      try {
        // check if file is in  use
        if (file.renameTo(file)) {
          process(file, config)
        }
      } catch {
        case e: Exception =>
      } finally {
        ...
      }
    }
  case None =>
    ...
}

def getFiles(path: String): Option[Array[File]] = {
new File(path).listFiles() match {
  case files if files != null =>
    Some(files.filter(file => file.lastModified < Calendar.getInstance.getTimeInMillis - 5000))
  case _ =>
    None
}
}

def process(file: File, clientConfig:Config) {
  ...
  file.delete
}

现在我的情况不同了 - 我正在处理成千上万个文件 - 我的吞吐量非常慢:50/秒(每个文件有 40kb)。

我想知道处理许多文件的最佳方法是什么。我应该替换方法 getFile() 以返回 N 个元素并在每个元素上应用 FileLock 吗?如果我使用 FileLock,我可以只检索未使用的元素。或者我应该使用 Java NIO 的东西吗?

提前致谢。

【问题讨论】:

  • 添加一些指标来了解哪些功能花费的时间最多。我想process 是你的瓶颈。多线程文件处理可能会有所帮助。

标签: java performance scala


【解决方案1】:

我认为您可以将 try catch 块包装在 Future 中,这样您就可以并行处理文件。 Apparently using an Execution Context backed by a cached threadpool is best for IO bound operations. 这也意味着您无需担心锁,因为您会为每个文件同步生成未来。

您也可以read the input files as a stream,这意味着您的代码将不再预先在内存中存储对所有文件的引用,而是仅存储对工作集(一个文件)的引用,但我认为这不是造成瓶颈的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多