- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在两级散列目录结构中对数百万个文件进行了重复数据删除存储。文件系统是磁盘上的 ext4 分区。文件的路径由其 MD5 散列值计算得出,如下所示:
e93ac67def11bbef905a7519efbe3aa7 -> e9/3a/e93ac67def11bbef905a7519efbe3aa7
当按顺序处理*文件列表(由存储在单独数据库中的元数据选择)时,我可以从字面上听到搜索产生的噪音(我假设是通过散列目录布局“随机化”)。
我的实际问题是: 如果它们存储在 ext4 分区上,是否有一种(通用的)方法以搜索优化的方式处理可能很长的潜在小文件列表在磁盘上(暗示使用 linux)?
这样的优化当然只有在小文件的份额足够大的情况下才有用。所以请不要太在意文件的大小分布。不失一般性,您实际上可以假设每个列表中只有小文件。
作为一个潜在的解决方案,我正在考虑按文件的物理磁盘位置或其他(启发式)标准对文件进行排序,这些标准可能与处理整个列表所需的查找操作的总量和长度相关。
关于文件类型和用例的说明(如果需要)
这些文件是多台台式机的去重备份。因此,您通常会在个人计算机上找到的任何文件都将包含在该分区中。然而,该处理将仅影响通过数据库选择的兴趣子集。
以下是一些用于说明的用例(列表并不详尽):
在研究这个问题时,我了解到 FIIBMAP
ioctl
命令(例如提到的 here )可能值得一试,因为文件不会四处移动,结果可能会与元数据一起存储。但我想只有当文件的 inode 的位置与内容的位置有些相关时,这才会作为排序标准。 ext4 也是这样吗?
*) 即打开每个文件并将文件头(任意字节数)或整个文件读入内存。
最佳答案
一个文件(尤其是当它足够大时)分散在磁盘上的几个 block 上(例如,在 ext2 维基页面的图中,它仍然与 ext4 有某种相关性,即使细节不同)。更重要的是,它可能在 page cache 中。 (因此不需要任何磁盘访问)。所以“按磁盘位置排序文件列表”通常没有任何意义。
我建议改为改进访问这些文件的代码。查看像 posix_fadvise(2) 这样的系统调用和 readahead(2) .
如果文件真的很小(每个只有数百字节),使用其他东西(例如 sqlite 或一些真正的 RDBMS,如 PostGreSQL 或 gdbm ...)可能会更快。
顺便说一句,添加更多 RAM 可以扩大页面缓存大小,因此整体体验。用一些 SSD 替换 HDD 也会有所帮助。
(另见 linuxatemyram)
Is it possible to sort a list of files to optimize read speed / minimize seek times?
这真的不可能。文件系统碎片(实际上)对于 ext4 并不重要。当然,备份所有文件系统(例如在一些 tar 或 cpio 存档中)并按顺序恢复它(在使用 mkfs
创建新文件系统之后)可能会稍微减少碎片,但不会那么多。
您可以优化您的文件系统设置( block 大小、簇大小等...例如 mke2fs(8) 的各种参数)。另见 ext4(5) .
Is there a (generic) way to process a potentially long list of potentially small files in a seek-optimized manner.
如果列表不是太长(否则,将其分成数百个文件的 block ),您可能会 open(2)那里的每个文件并使用 readahead(2)在每个这样的文件描述符上(然后是 close(2) 它)。这会以某种方式预填充您的 page cache (并且内核可以重新排序所需的 IO 操作)。
(我不知道这对你的情况有多有效;你需要进行基准测试)
我不确定您的问题是否有软件解决方案。您的问题可能与 IO 相关,因此瓶颈可能出在硬件上。
请注意,在大多数当前的硬盘上,CHS寻址(由内核使用)是由磁盘 Controller 处理的一些“逻辑”寻址,与物理几何不再有太大关系。了解 LBA , TCQ , NCQ (所以今天,内核对硬盘磁头的实际机械运动没有直接影响)。 I/O scheduling主要发生在硬盘本身(在内核中发生的不多)。
关于linux - 磁盘 : Is it possible to process an arbitrary list of files in a seek-optimized manner? 上的 Ext4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49379710/
如果我们查看 istream 和 ostream 的文档,我们有以下功能: istream& seekg ( streampos pos ); istream& seekg ( streamoff o
如果我想实现 seek() 来完成 SeekableIterator 接口(interface),如果搜索的位置无效,我是否应该在内部恢复到旧位置?像这样: public function seek(
python documentation说: In text files (those opened without a b in the mode string), only seeks relat
我正在编写一个 c++ 方法,需要更新打开文件 (ofstream) 中的一些字符。 该方法获取一个映射作为输入,其中键是一个偏移量(文件中的位置),值是一个字符。 代码示例 typedef map
我注意到,当我做这样的事情时: with open('testfile', 'wb') as fl: fl.seek(2048*512) fl.write(b'aaaaa') 无论我的
我正在开发一个 android 应用程序,我想在状态栏中添加音量控制。我可以在状态栏中添加一个搜索栏吗? 我使用过 NotificationManager,我发现在通知栏中添加动画很困难。 但是任何人
我注意到,当我做这样的事情时: with open('testfile', 'wb') as fl: fl.seek(2048*512) fl.write(b'aaaaa') 无论我的
Python seek()函数:设定读写位置 可以使用 seek() 函数调整当前读写文件的位置。例如,我们从文件头部读取了 1000 个字节,处理这 1000 个字节后发现还有一个很重要的信息在文件
我在 Delphi 2006 中使用 TFileStream。当我使用超出范围的偏移量调用 TFileStream.Seek 时,我得到不同的返回值。当我寻找低于流开头的位置时,该函数返回 -1,如果
我们刚刚在 Delphi 2007 中遇到了 TFileStream.Seek 的一种特殊行为(实际上该方法是从 THandleStream 继承的): 您可以在没有错误的情况下查找文件末尾之外的内容
这是取自 https://forums.embarcadero.com/message.jspa?messageID=219481 的代码片段 if FileExists(dstFile) then
我有一个电子表格,其中包含大量输入,但只有一个输出(价格)。 我想让 Excel 自动更新其中一个输入(称为输入 1),以便在调整其他输入的同时保持价格不变。 我知道“目标搜索”可以做到这一点,但我不
根据 API ,这些是事实: seek(long bytePosition)方法简单来说就是将指针移动到用 bytePosition 指定的位置参数。 当 bytePosition大于文件长度,则文件
我们正在使用 StreamingKit (https://github.com/tumtumtum/StreamingKit) 从流式 m4a 音频源列表中播放,用户可以在这些音频源之间自由来回移动。
我有一个程序可以替换文件中的内容。但是却导致了IO异常,我不知道我哪里逻辑错了? 代码如下: import java.io.File; import java.io.RandomAccessFile;
我想从Excel中导出数据 我尝试下面的代码 def exel_all_attendance(request,course_id): all_submit_attendance = Submi
我正在尝试使用 FileStream。寻求快速跳转到一行并阅读它。 但是,我没有得到正确的结果。我试图看这个有一段时间了,但不明白我做错了什么。 环境: 操作系统:Windows 7 架构:.NET
我正在处理大文件,从 10Gb 开始。我正在将文件的各个部分加载到内存中进行处理。以下代码适用于较小的文件 (700Mb) byte[] byteArr = new byte[layerPixelC
我有一个 for 循环,它被设计为接受一个目标数字,并循环遍历堆栈,直到它在堆栈 [target] 中找到数据并且它应该返回该数据。 不幸的是,我只能让它返回它所在的数组的位置或一串随机数字(随着我的
我创建了一个包含以下条目的文件,由 file.read() 返回 'abcd\nefgh\n1234\nijkl\n5678\n\nend' 我现在打开要阅读的文件,使用“f”作为处理程序。f.rea
我是一名优秀的程序员,十分优秀!