在基于内存的计算模型中,通过考虑数据结构,可以抽象地完成需要完成的唯一运行时间计算。
但是,高性能磁盘I / O算法上没有很多文档。因此,我提出以下问题:
1)我们如何估计磁盘I / O操作的运行时间?我假设有一组简单的常量,我们可能会在磁盘上查找值,而不是在内存中...
2)更具体地说,访问文件中特定索引的性能有何区别?这是一个恒定的时间操作吗?或者它取决于指数的“远低于”?
3)最后...... JVM如何优化文件索引部分的访问?
而且......就资源而言 - 总的来说......磁盘数据结构的实现是否有任何好的习惯用法或库?
答案 0 :(得分:2)
1)如果您需要比较各种IO功能的速度,您只需运行一千次并记录需要多长时间。
2)这取决于您计划如何到达此索引。文件开头的索引与文件中间的索引完全相同。它只是指向磁盘上的一段内存。如果你从一开始就开始到达这个指数并在那里进展,那么是的,它需要更长的时间。
3/4)这些都不是由操作系统本身管理的。 Java并不足以处理这类操作。
答案 1 :(得分:2)
1)我们如何估计磁盘I / O操作的运行时间?我假设有一组简单的常量,我们可能会在磁盘上查找值,而不是在内存中...
在Computer Systems: A Programmer's Perspective的第6章中,他们提供了一个非常实用的数学模型,说明从典型磁盘读取一些数据需要多长时间。
引用链接pdf中的最后一页:
Putting it all together, the total estimated access time is
Taccess = Tavg seek + Tavg rotation + Tavg transfer
= 9 ms + 4 ms + 0.02 ms
= 13.02 ms
This example illustrates some important points:
• The time to access the 512 bytes in a disk sector is dominated by the seek time and the rotational
latency. Accessing the first byte in the sector takes a long time, but the remaining bytes are essentially
free.
• Since the seek time and rotational latency are roughly the same, twice the seek time is a simple and
reasonable rule for estimating disk access time.
*注意,链接的pdf来自作者网站==没有盗版
当然,如果最近访问的数据是被访问的,那么它在内存heiarchy中的某个地方被缓存的可能性很大,在这种情况下,访问时间非常小(实际上,与磁盘访问时间相比,“接近即时”)
2)更具体地说,访问文件中特定索引的性能有何区别?这是一个恒定的时间操作吗?或者它取决于指数的“远低于”?
如果搜索到的位置不是顺序存储在附近,则可能发生另一个搜索+旋转时间量。它取决于您正在寻找的文件中的位置,以及该数据在物理上存储在磁盘上的位置。例如,保证碎片文件会导致磁盘搜索读取整个文件。
要记住的是,即使您可能只请求读取几个字节,物理读取往往以固定大小的块(扇区大小)的倍数出现,最终在缓存中。因此,您可能稍后在文件中寻找附近的某个位置,并幸运地知道它已经在您的缓存中。
顺便说一句 - 如果你对这个主题感兴趣,那本关于记忆等级的书中的完整章节就是纯金。
答案 2 :(得分:1)
1)我们如何估计磁盘I / O操作的运行时间?我假设有一组简单的常量,我们可能会在磁盘上查找值,而不是在内存中...
没有这样的通用常数。事实上,物理磁盘I / O,文件系统和操作系统的性能模型太复杂,无法对特定操作进行准确预测。
2)更具体地说,访问文件中特定索引的性能有何区别?这是一个恒定的时间操作吗?或者它取决于指数的“远低于”?
预测太复杂了。例如,它取决于操作系统缓冲的文件数量,物理磁盘参数(例如寻道时间)以及操作系统在所有应用程序中如何有效地安排磁盘活动。
3)最后...... JVM如何优化对文件索引部分的访问?
没有。这是一个操作系统级别的事情。
4)磁盘数据结构的实现是否有任何好的习语或库?
如果没有实际要求的更多细节,很难回答。但最好的想法是不要试图自己实现这种事情。找到一个非常适合您要求的现有库。
答案 3 :(得分:1)
高性能磁盘I / O算法。
硬件的性能通常非常重要,因此您在软件中所做的事情并不重要。你应该首先考虑购买合适的硬件。
我们如何估计磁盘I / O操作的运行时间?我假设有一组简单的常量,我们可能会在磁盘上查找值,而不是在内存中...
它们很简单,因为它们总是需要花费很多微秒。例如,HDD可以执行80-120 IOP,SSD可以执行80K到230K IOP。您通常可以轻松获得制造商指定的1/2,并且获得100%是您可以在软件中进行技巧的地方。除非您拥有大量内存并且只读过数据,否则操作系统将为您完成所有工作,从而永远不会像硬盘一样执行硬盘驱动器。
您可以购买hybrid drives,它可以提供硬盘的容量,但性能接近SSD的容量。对于商业生产用途,您可能愿意花费多个驱动器的磁盘子系统。这可以将性能提高到500 IOPS,但可以显着增加成本。您通常购买磁盘子系统,因为您需要它提供的容量和冗余,但您通常也会获得性能提升,但有更多的自旋一起工作。虽然disk subsystem performance上的这个链接已经过时(2004年),但从那时起它们的变化并没有那么大。
更具体地说,访问文件中特定索引的性能有何区别?这是一个恒定的时间操作吗?或者它取决于指数的“远低于”?
这取决于它是否在内存中。如果它非常接近您最近阅读的数据,如果它很远,它取决于您过去访问的内容以及可以自由缓存磁盘访问的内存量。
每个硬盘的典型延迟时间约为8毫秒(即,如果您有10个随机读取排队,则可能为80毫秒)SSD的典型延迟为25到100 us。读取已经排队的可能性要小得多,因为它的开始要快得多。
JVM如何优化对文件索引部分的访问?
假设您使用的是合理的缓冲区大小,那么您在软件中几乎无法做到这一点。您可以做的是由操作系统完成。
是否有适用于磁盘数据结构实现的好习惯用法或库?
使用合理的缓冲区大小,如512字节到64 KB。
更重要的是,根据您的要求购买合适的硬件。
答案 4 :(得分:1)
另请注意,Linux系统至少允许使用不同的文件系统。根据应用程序的不同,可能比其他应用程序更合适。 http://en.wikipedia.org/wiki/File_system#Linux