【问题标题】:OS.File check last modified date before OS.readOS.File 检查 OS.read 之前的最后修改日期
【发布时间】:2014-06-27 23:31:33
【问题描述】:

我使用OS.File.read 读取文件内容。在窗口的焦点上我做OS.File.stat 并检查它的最后修改日期。然后我记录下这个日期。在窗口的下一个焦点上,我再次OS.File.stat 文件,如果修改日期是新的,那么我将对其进行OS.File.read。

我想知道有没有更有效的方法?例如:我启动OS.File.read,默认情况下它会获取应该包含上次修改日期的文件头,我检查它作为它的读数,如果它不是新日期,我就取消读取。从编码的角度来看,这会更有效,但从性能的角度来看可能没有那么多?

【问题讨论】:

  • 这是我认为最有效的方式。 1) 统计 2) 检查日期 3) 读取

标签: javascript file-io firefox-addon


【解决方案1】:

简答:取决于?!

更高效的方法取决于文件本身以及使用模式和系统工作负载。

通常,OS.File.stat 然后选择性读取可能会更有效,因为文件 I/O 可能是瓶颈,您只需避免一些 I/O(大部分时间)。

对于您经常阅读但只是偶尔写入的小文件,仅读取文件可能更有效。文件元数据和数据很可能在 OS 磁盘缓存中,使得文件 I/O 变得非常快,OS.File 的实际线程间消息传递开销和 js-ctypes 开销成为瓶颈。然而,这是一个非常特殊的情况。

另外,如果文件更改非常频繁,以至于几乎每次OS.stat + 检查都会导致必须再次读取文件,那么只读取文件可能也更有效。但在那种情况下,我会认真考虑选择使用文件是否是正确的方式,或者是否另一种通信方式不会更好(例如套接字)。

结论

所以,我会选择.stat/check/.read,因为对磁盘缓存和系统工作负载做出假设可能很糟糕。

可以避免磁盘 I/O 吗?

但是,如果可能的话,我会避免首先轮询文件。如果它是您不希望其他进程写入的特定于您的附加组件的文件,则读取它一次,然后将数据保存在内存中的共享位置,例如JS Code Module 或main.js SDK 附加组件或 bootstrap.js 自举附加组件。在写入时,也更新缓存的数据。

如果您担心其他进程可能会同时写入您的文件,那么只需使用独占锁打开您的文件,并且不要在插件运行时再次关闭它。

let options = {
  winShare: 0 // Exclusive lock on Windows
};
if (OS.Constants.libc.O_EXLOCK) {
  // Exclusive lock on *nix
  options.unixFlags = OS.Constants.libc.O_EXLOCK;
}
let file = yield OS.File.open(..., options);

如果您希望其他程序写入该文件并且对此没有问题,或者如果您首先使用该文件作为进程间通信的方式,那么您无法避免重新读取该文件,当然。

【讨论】:

  • 老兄,你有一项技能,你应该参与政治。我不能说,更不用说弄清楚如何说超过 1 个句子了..
  • 问题:如果作者锁了,插件完成后如何解锁?因为插件可能会一直运行到关闭浏览器。
  • 如果它是一个无需重启的插件,您只需明确关闭OS.File 句柄,因为该插件可能在浏览器退出之前很久就被禁用。如果它是一个“重新启动”附加组件,您不必真正关心。无论如何,一旦 Firefox 进程关闭,句柄就会关闭,释放锁(尽管我会明确地关闭文件,无论如何,因为自己清理总是一个好主意)。
  • 啊,我在上面的例子中看到了,我们会这样做file.close()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多