【问题标题】:how to handle Simultaneous modification on same csv file?如何处理同一个csv文件的同时修改?
【发布时间】:2020-06-30 02:10:48
【问题描述】:

我在 node.js 中有代码,它将使用 fast-csv 读取 CSV 文件。

此 CSV 文件由另一个节点应用程序 (X) 生成,我无法控制它。

X 将在这个文件中写入数据。

如果 X 尝试写入,而我的代码同时尝试读取会怎样?

问题:

  1. 在这种情况下我的代码会出现异常吗?

  2. 如果是,应该如何处理?

我试图检查文件是否打开

fs.open('/Users/meenalyengul/Documents/fotsWorkspace/fots/lib/newDemo/files/test.xlsx', 'r+', function(err, fd) {
  if (err && err.code === 'EBUSY') {

  }
});

此代码不适用于 mac。

【问题讨论】:

  • 简而言之,这就是我们发明数据库的真正原因。
  • 尝试回答这几个问题以获得相关帮助: 1) 该文件是否持续增长?在某些时候这个文件被关闭了吗? 1)这个文件有多大? 2)程序如何知道文件名? 3)你什么时候可以开始阅读这个文件?你有回调端点吗? 4) 你是这个 X 程序的发起者吗?
  • 这因操作系统而异。在 Windows 中,如果文件的编写者以独占模式打开它(防止其他人打开它进行读/写),那么当您尝试打开它时会出现错误,并且您可能想要实现某种重试算法。如果其他应用程序没有以这种独占模式打开它,那么您只是遇到了并发问题,正如其他评论者所说,这是数据库擅长的,而不是平面文件。可能,您需要编写一个测试应用程序来确切了解当两个进程都尝试同时访问文件时的行为。
  • @jfriend00 EBUSY 检查在 windows 上有效,但在 mac 上无效。
  • @Eric 1. 程序 X 将随时使用大量数据写入此文件。但不是连续的。我不确定此文件是否已关闭。 2. 在这个文件中可能有 100 条记录。 3.文件名可配置。我的代码是 cron 作业,每 15 分钟运行一次。 4. 我对程序 X 没有任何控制权

标签: javascript node.js fs


【解决方案1】:

您描述了一种没有好的解决方案的情况。在 Mac 平台上,显然没有对文件的独占访问权限,因此使用您的正常文件操作,您无法判断文件何时被您无法控制的其他程序使用。

如果您可以通过观察这个修改文件的其他程序修改文件,然后在它再次修改文件之前没有修改文件的一段安静时间(就像它修改文件的频率不超过每隔几分钟),这看起来像是你可以依赖的东西,那么我可以想到一个黑客。

您要做的是拥有一个始终运行并监视感兴趣的文件的 nodejs 程序。当您看到它发生变化时(通过查看修改时间或文件大小或两者兼而有之),然后您将等待一些规定的时间以确保完成修改(可能 10 秒,基于您观察到的访问模式通过程序更改文件),您可以快速将文件复制到您自己的文件名。然后,您每 15 分钟运行一次的 cron 作业可以将该文件副本用作最新数据的安全副本,在您阅读时不会被修改。

要查看文件是否有修改,您可以使用自己的代码每 30 秒左右轮询一次文件统计信息,也可以使用fs.watch() 动态查看文件的更改。要制作文件的副本,您可以使用fs.copyFile()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    相关资源
    最近更新 更多