【问题标题】:Does saving files in a ".zip" folder speed up file write time to network drive?将文件保存在“.zip”文件夹中会加快文件写入网络驱动器的时间吗?
【发布时间】:2016-09-26 09:53:03
【问题描述】:

我知道当我将新文件写入以“.zip”结尾的文件夹时,它会压缩文件。这是在 JAVA 中使用 BufferedOutputStream 并保存到 Windows 文件系统时。我将这些文件保存到网络驱动器,因此写入时间取决于网络速度。

保存到 .zip 文件夹会加快写入时间吗?换句话说,它是传输未压缩的数据然后压缩它(因此它不会加快写入时间)还是压缩然后写出文件?抱歉,如果这是一个无知的问题。

【问题讨论】:

  • 试试看,写一些压缩和不压缩的数据,并测量时间。
  • 最小化网络负载的一个好方法是使用GZIPOutputStream 压缩通过网络发送的数据,然后在读取流时在另一端使用GZIPInputStream 显式解压缩。 (GZIP 比 ZIP 压缩得更好)。
  • 仅使用“.zip”作为文件扩展名不会自动压缩内容...您需要从Java显式压缩文件。
  • 当我在 Windows 中查看该文件夹时,它说它已被压缩。它给出了实际大小和压缩后的大小。
  • BufferedOutputStream 不压缩。 .zip 文件夹可能是 NTFS 压缩文件夹,也许?这意味着您通过网络发送未压缩的文件,主机将即时压缩它。如果有的话,这可能会使它变慢。网络上的数据传输将花费和以前一样多的时间,因为它仍在发送未压缩的字节。写入文件的主机现在首先压缩它,然后写入压缩的字节。压缩很可能会成为瓶颈,并且比写入操作中节省的时间花费更多的时间。

标签: java file-writing bufferedoutputstream


【解决方案1】:

问题中有很多误解,我认为值得一次解决。

我知道当我将新文件写入以“.zip”结尾的文件夹时,它会压缩文件。

这是不正确的。创建带有“.zip”后缀的文件不会自动将其压缩。将文件写入以“.zip”作为文件名后缀 (?!?) 的目录也不行。不是在 Java 中。不是其他语言。

为了获得压缩,应用程序需要采取措施来实现这一点。在 Java 中,您可以使用ZipOutputStream 以 ZIP 文件格式编写文件。但是,ZIP 文件实际上是一种“存档”格式,旨在将多个文件保存在一个 ZIP 文件中。如果您只是尝试压缩单个文件,还有更好的选择;例如GZIPOutputStream.

(您所说的这个所谓的“ZIP 文件夹”也有可能是一个普通的 ZIP 文件,它已被“挂载”为回送文件系统。您/其他人必须明确设置它。无论如何,如果这是这里发生的事情,那与Java无关。这一切都发生在外部软件和“安装”ZIP的操作系统中。)

这是在 JAVA 中使用 BufferedOutputStream 并保存到 Windows 文件系统时。

呃……不。往上看。但是您是正确的,可能使用BufferedOutputStream 来写入文件会更好,尽管它只有在您的应用程序以小块写入文件时才真正有帮助;例如一次一个字节。 (流压缩使问题复杂化,因此很难给出一个简单、通用的答案。)

我将这些文件保存到网络驱动器,因此写入时间取决于网络速度。

正确。它还取决于网络延迟、使用的协议和远程文件服务器上的负载。 (如果您“安装”了 ZIP,那么这也会增加开销。)

保存到 .zip 文件夹会加快写入时间吗?

也许吧。往上看。这取决于 ZIP 文件夹的含义。

忽略这一点,从 Java 中以压缩和/或存档形式写入文件(正确的方式)可能会加快写入速度。实际上有两件事需要考虑:

  • 对于简单的压缩,您需要在应用程序 (!!) 压缩和解压缩数据所花费的时间与通过移动和存储更少字节所节省的时间(和磁盘空间)之间进行权衡。

  • 对于 ZIP 文件(和类似的存档格式),还有第二种可能的保存方式。与存储和检索包含这些文件的单个 ZIP 文件相比,从文件系统存储和检索大量单个小文件的速度较慢。

换句话说,它是传输未压缩的数据然后再压缩它(因此它不会加快写入时间)还是压缩然后写出文件?

变量太多,很难确定。但除非你做了一些奇怪的事情,否则字节很可能是以压缩形式通过网络发送的。


最后,我建议您不要尝试将挂载的 ZIP 文件和网络共享结合起来:

  • 两者的结合可能会以降低性能的方式进行交互。

  • 如果网络共享在不方便的时候脱机,您最终可能会遇到 ZIP 损坏或文件丢失的风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 2020-02-18
    • 2019-01-11
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2023-03-17
    相关资源
    最近更新 更多