java—编写多个数据量相同的文件与编写一个数据量相同的大文件

im9ewurl  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(352)

我想在本地磁盘上写一个大文件。我把这个大文件分成许多小文件,然后试着把它写到磁盘上。但我观察到,当我分割文件并尝试写入时,磁盘写入时间大大增加。
另外,我从一个磁盘上复制文件并将其写入另一台计算机的磁盘(reducer)。我观察到阅读时间也有很大的增长。有人能解释一下原因吗?我正在使用hadoop。
谢谢!

ulydmbyx

ulydmbyx1#

这是由于底层的文件系统和硬件造成的。
除了每个文件的内容之外,每个文件都有开销,例如mft for ntfs(在windows上)。因此,对于单个大文件,文件系统可以减少簿记,因此速度更快。
按照操作系统的安排,单个大文件可能会被写入硬盘的连续扇区,但多个小文件可能会被写入,也可能不会被写入。因此,由此增加的寻道时间可能是许多小文件读取时间增加的原因。
操作系统的效率也可能起到很大的作用。例如,它是否预取文件内容,如何使用缓冲区等。对于许多小文件,操作系统更难有效地使用缓冲区(并处理其他问题)。(在不同的情况下,它的行为可能不同。)
编辑:对于您提到的复制过程,通常您的操作系统会按照以下步骤进行:
从磁盘读取数据->将数据写入缓冲区->从缓冲区读取->写入(可能是另一个)磁盘
这通常是在多个线程中完成的。当处理许多小文件时,操作系统可能无法有效地协调这些线程(有些线程非常忙,而另一些线程则必须等待)。对于单个大文件,操作系统不必处理这些问题。

3htmauhk

3htmauhk2#

每个文件系统都定义了一个最小的单元(不可共享)来存储名为page的数据。例如,在文件系统中,页面大小为4kb。现在,如果您保存一个8KB的大文件,它将消耗磁盘上的2页。但如果将文件分成4个文件,每个文件大小为2kb,则会占用磁盘上4个半满页,占用16kb的磁盘空间。
类似地,如果您将文件分成8个小文件,每个文件大小为1kb,那么它将消耗磁盘中的8个页面,尽管部分已满,并且您的32kb磁盘空间已被消耗。
阅读开销也是如此。如果你的文件有好几页,那么可能会分散。这将导致seektime/访问时间的高开销。

相关问题