【问题标题】:Processing 100 MB+ files from FTP server in less than 30 sec?在 30 秒内从 FTP 服务器处理 100 MB 以上的文件?
【发布时间】:2017-06-19 11:14:21
【问题描述】:

问题说明: FTP 服务器充满了以 100 Mbps(即 12.5 MB/s)的速率传入的文件,每个文件大小约为 100 MB。文件将在其创建时间戳后 30 秒后被删除。如果任何进程有兴趣读取这些文件,它应该在 30 秒内带走完整的文件。我正在使用 Java 来解决这个特殊问题。

需要建议哪种设计模式最适合此类问题。我如何确保在服务器删除每个文件之前都会使用它。

您的建议将不胜感激。谢谢

【问题讨论】:

  • 为该问题陈述编写代码不是设计模式的问题。如果有的话,这是一个高效的 IO 操作问题。 “我如何确保在服务器删除每个文件之前都会使用它?” => 老实说。你不能。有很多事情可能出错。你想让它防故障吗?如果读取了几乎所有字节(但不是全部)然后文件消失了怎么办?如果其他进程有句柄,它甚至会消失吗?真的,这个问题太宽泛了。
  • 其他进程在访问文件时应该对文件加锁,这样我想它就不会被服务器删除。
  • @KevynMeganck 是的,在这种情况下放置锁定是可能的并且很有帮助。谢谢
  • @KevynMeganck 如果你能找到防止删除的锁实现。

标签: java multithreading design-patterns concurrency ftp


【解决方案1】:

如果 Java 应用程序与 FTP 服务在同一台机器上运行,那么它可以使用File.renameTo(File) 或等效的方法将所需文件从 FTP 服务器目录移出到另一个目录。然后它可以在闲暇时处理它。它可以使用WatchService 来监视 FTP 目录中新到达的文件。它应该监视目录上的事件,当文件开始出现时,它应该等待写入停止发生。 (取决于操作系统,您可能会也可能无法在 FTP 服务写入文件时移动文件。)

Java 应用程序能否跟上所需的处理速率是一个次要问题。但是,如果您有多个内核和多个工作线程,那么您的应用程序可能会并行处理它们。 (这取决于处理的计算和/或 I/O 密集型。以及 Java 线程读取文件的速率......这将取决于操作系统,也可能取决于硬件。)

如果 Java 应用程序没有在 FTP 服务器上运行,它可能需要使用 FTP 来获取文件。我怀疑您是否可以始终如一地可靠地执行某些操作;即不会偶尔丢失文件。

【讨论】:

  • 感谢您的回答。 “如果 Java 应用程序与 FTP 服务在同一台机器上运行,那么它可以使用 File.renameTo(File) 或等效的方法将所需文件从 FTP 服务器目录移出到另一个目录”-> Java 应用程序将是远程连接到 FTP 服务器。
  • 然后看最后一段。
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多