我需要编写一些代码(使用任何语言)来处理驻留在本地Linux文件系统上的10,000个文件。每个文件的大小约为500KB,并由固定大小的记录组成,每个记录大小为4KB。
每条记录的处理时间可以忽略不计,并且可以在不同的文件内和跨不同的文件以任何顺序处理记录。
一个天真的实现会以某种任意的顺序一个接一个地读取文件。然而,由于我的磁盘读取速度非常快,但是寻道速度很慢,这几乎肯定会产生受磁盘寻道约束的代码。
有没有办法对读数进行编码,使其受磁盘吞吐量而不是寻道时间的限制?
一行查询是尝试获得文件在磁盘上所在位置的大致概念,并使用该概念对读取进行排序。但是,我不确定可以使用什么API来实现这一点。
当然,我对任何其他想法都持开放态度。
文件系统是ext4,但这是可以协商的。
发布于 2012-03-23 22:19:42
也许您可以通过使用aio_read快速连续地调度所有读取来完成读取。这将一次将所有读取放入文件系统读取队列中,然后文件系统实现可以自由地以最小化寻道的方式完成读取。
发布于 2012-03-23 22:20:52
一种非常简单的方法,尽管不能保证结果。一次打开尽可能多的文件,一次读取所有文件-无论是使用线程还是异步I/O。这样,磁盘调度程序就会知道您读取的内容,并可以自行减少寻道。编辑:正如wildplasser所观察到的,并行open()可能只能使用线程,而不能使用异步I/O。
另一种选择是尝试自己做繁重的工作。不幸的是,这涉及到一个困难的步骤-获得文件到物理块的映射。没有标准接口可以做到这一点,您可能可以从ext2fsprogs或内核FS驱动程序中提取逻辑。这涉及到读取挂载的文件系统底层的物理设备,它可以在您尝试获取一致快照的同时对其进行写入。
获得物理数据块后,只需对它们进行排序,将映射反向到文件偏移量,并按物理数据块顺序执行读取。
发布于 2012-03-23 22:16:39
您能推荐使用SSD进行文件存储吗?这应该会大大减少搜索时间,因为没有头部可以移动。
https://stackoverflow.com/questions/9839820
复制相似问题