我想写一个大文件到本地磁盘。 我将大文件分成许多小文件,然后尝试将其写入磁盘。但是我观察到,当我拆分文件并尝试写入时,磁盘写入时间有很大增加。
此外,我从磁盘复制文件并将其写入另一台计算机的磁盘( reducer )。我观察到阅读时间也有很大增加。任何人都可以向我解释原因吗?我正在使用 hadoop。
谢谢!
最佳答案
这是由于底层文件系统和硬件。
除了内容之外,每个文件都有开销,例如 NTFS 的 MFT(在 Windows 上)。所以对于单个大文件,文件系统可以做更少的簿记工作。因此速度更快。
根据您的操作系统的安排,单个大文件往往会尽可能写入硬盘驱动器的连续扇区,但多个小文件可能会也可能不会这样写入。因此,由此导致的寻道时间增加可能是许多小文件读取时间增加的原因。
您的操作系统的效率也可能发挥重要作用。例如它是否预取文件内容,它如何使用缓冲区等。对于许多小文件,操作系统更难以有效地使用缓冲区(并处理其他问题)。(在不同的场景下它可能表现不同。)
编辑:至于您提到的复制过程,通常您的操作系统按以下步骤进行:
从磁盘读取数据->将数据写入缓冲区->从缓冲区读取->写入(可能是另一个)磁盘
这通常在多个线程中完成。当处理很多小文件时,操作系统可能无法有效地协调这些线程(一些线程很忙,而另一些则必须等待)。对于单个大文件,操作系统不必处理这些问题。
关于java - 写入相同数据量的多个文件与写入相同数据量的单个大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13151451/