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

标签 java hadoop mapreduce

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

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

谢谢!

最佳答案

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

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

根据您的操作系统的安排,单个大文件往往会尽可能写入硬盘驱动器的连续扇区,但多个小文件可能会也可能不会这样写入。因此,由此导致的寻道时间增加可能是许多小文件读取时间增加的原因。

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

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

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

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

关于java - 写入相同数据量的多个文件与写入相同数据量的单个大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13151451/

相关文章:

java - 如何减少构造函数重载的代码

java - 当我一直按后退按钮登录时,字段显示先前插入的用户数据

Hadoop Versions 好像分0.x, 1.x, 2.x,但是在讨论YARN/MapReduce的时候,每一页都是指Hadoop 1和Hadoop 2.0

hadoop - 使用变量替换 (-d|--define) 的 Hive 参数因字符串参数而失败

java - Hadoop:使用不同的Mappers处理不同的文件,并使用Custom Writable在Reducer中合并结果

Hadoop 推测任务执行

java - 如何检查 Java 中的加密结果(SHA1PRNG 和 AES)?

java - RecyclerView 占用所有屏幕空间

mongodb - 从PIG写入MongoDB-错误2116-未找到mongodb模式

java - 复杂的 MapReduce 配置场景