多文件变长Tensor的指定索引快速定位最优方法咨询
批量定位Tensor索引对应文件的最优方法
核心思路:预处理生成前缀和索引表 + 二分查找
这种方法能把单次查找复杂度降到O(logN),批量处理效率拉满,完全适配2万文件、总长度380万的场景。
第一步:一次性预处理生成索引表
遍历所有20000个文件,记录每个文件的Tensor长度,同时计算前缀和数组——比如prefix_sum[i]表示前i+1个文件的总长度(可根据习惯调整索引逻辑)。举个实际例子:- file_0长度320,
prefix_sum[0] = 320 - file_1长度1036,
prefix_sum[1] = 320 + 1036 = 1356 - file_2长度458,
prefix_sum[2] = 1356 + 458 = 1814
把这个前缀和数组和对应的文件索引(或文件名)存成单独的小文件,比如用numpy存成.npy或普通文本文件。这一步只做一次,后续查找直接加载这个索引表,不用再遍历所有Tensor文件。
- file_0长度320,
第二步:批量查找用二分查找快速定位
拿到要查询的索引后,直接在前缀和数组上做二分查找:找到第一个大于目标索引的前缀和位置,对应的就是目标文件。
比如查索引500,第一个大于500的前缀和是1356(对应prefix_sum[1]),那这个索引就在file_1里。
用Python的话,直接调用标准库的bisect.bisect_right函数就行:file_idx = bisect.bisect_right(prefix_sum, target_index),得到的file_idx就是对应的文件序号。进阶优化:超大量索引的高效处理
如果要查的索引数量特别多,先把所有目标索引从小到大排序,然后遍历一次前缀和数组,就能一次性匹配所有落在当前区间的索引,比逐个做二分查找效率更高,减少重复计算。
内容的提问来源于stack exchange,提问作者HATEM EL-AZAB
相关产品推荐
相关产品推荐

