【发布时间】: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