写入相同数据量的多个文件与写入相同数据量的单个大文件

时间:2012-10-31 04:50:06

标签: java hadoop mapreduce

我想写一个大文件到本地磁盘。 我将大文件拆分成许多小文件,然后我尝试将其写入磁盘。但我观察到,当我分割文件并尝试编写时,磁盘写入时间大大增加。

另外,我从磁盘复制文件并将其写入另一台计算机的磁盘(reducer)。我发现阅读时间也有很大的增加。任何人都可以解释一下原因吗?我正在使用hadoop。

谢谢!

2 个答案:

答案 0 :(得分:2)

这是由于底层文件系统和硬件。

除了内容之外,还有每个文件的开销,例如NTFS的MFT(在Windows上)。因此,对于单个大文件,文件系统可以减少簿记。因此它更快。

根据您的操作系统的安排,单个大文件往往会尽可能写在硬盘驱动器的连续扇区上,但可能会或可能不会写入多个小文件。因此,增加的搜索时间可能会导致许多小文件的阅读时间增加。

您的操作系统的效率也可能起到很大作用。例如,它是否预取文件内容,如何使用缓冲区等。对于许多小文件,操作系统更难以有效地使用缓冲区(并处理其他问题)。(在不同的情况下,它可能表现不同。)

编辑:至于你提到的复制过程,通常你的操作系统按以下步骤进行:

从磁盘读取数据 - >将数据写入缓冲区 - >从缓冲区读取 - >写入(可能是另一个)磁盘

这通常在多个线程中完成。处理许多小文件时,操作系统可能无法有效地协调这些线程(某些线程非常繁忙,而其他线程必须等待)。对于单个大文件,操作系统不必处理这些问题。

答案 1 :(得分:2)

每个文件系统都有一个最小的单位(不可共享),用于存储名为page的数据。例如,在文件系统中,您的页面大小为4KB。现在,如果您保存一个8 KB的大文件,它将占用磁盘上的2个页面。但是如果你将文件分成4个文件,每个文件大小为2KB,那么它将消耗占用16KB磁盘空间大小的4个半填充页面。

同样,如果您将文件分成8个小文件(每个文件大小为1KB),那么它将占用磁盘中的8个页面,但会部分填充,并消耗32KB的磁盘空间。

阅读开销也是如此。如果您的文件为多个页面,那么可能会分散。这将导致寻道时间/访问时间的高开销。