如何快速从txt文件中加载格式为np.ndarray的人脸特征数据
方案1:使用numpy内置loadtxt方法(比纯Python循环快10~20倍)
直接通过参数指定跳过第一列文件名,批量读取后512列特征,底层为C实现,无Python循环开销:
import numpy as np # usecols指定读取第1到512列(跳过第0列的文件名),dtype用float32符合人脸特征精度要求,比默认float64省一半内存和读取时间 feat_matrix = np.loadtxt("你的数据集文件路径.txt", usecols=range(1, 513), dtype=np.float32) # 若文件过大内存不足,可添加mmap_mode='r'参数做磁盘映射,无需全量加载进内存即可使用 # feat_matrix = np.loadtxt("你的数据集文件路径.txt", usecols=range(1, 513), dtype=np.float32, mmap_mode='r')
方案2:使用pandas读取(比numpy.loadtxt再快3~5倍,适合千万级大文件)
pandas的read_csv底层做了大量IO优化,处理空格分隔的大文件效率更高:
import pandas as pd import numpy as np # sep='\s+'匹配任意数量空格作为分隔符,header=None说明无表头,跳过第0列文件名 df = pd.read_csv("你的数据集文件路径.txt", sep='\s+', header=None, usecols=range(1, 513), dtype=np.float32) feat_matrix = df.values
千万级记录用该方案通常仅需3~5分钟即可完成加载。
方案3:预转二进制格式(后续加载速度提升百倍)
如果该数据集需要多次加载,建议第一次读取完成后直接存为numpy专用二进制格式,后续使用时可直接秒加载:
# 第一次读取后存储 np.save("人脸特征集.npy", feat_matrix) # 后续加载,千万条记录仅需几秒即可完成 feat_matrix = np.load("人脸特征集.npy")
方案4:多进程分块加载(适合超大规模单文件)
如果单文件过大内存无法一次性放下,可以拆分文件为多个块后用多进程并行处理,避开Python GIL限制:
from concurrent.futures import ProcessPoolExecutor import numpy as np def process_chunk(lines): feats = [] for line in lines: feat = [float(x) for x in line.split()[1:]] feats.append(feat) return np.array(feats, dtype=np.float32) if __name__ == "__main__": chunk_size = 100000 # 每个块10万行,可根据内存调整 chunks = [] with open("你的数据集文件路径.txt", "r") as f: temp_lines = [] for line in f: temp_lines.append(line) if len(temp_lines) == chunk_size: chunks.append(temp_lines) temp_lines = [] if temp_lines: chunks.append(temp_lines) # 多进程并行处理每个块 with ProcessPoolExecutor() as executor: chunk_results = list(executor.map(process_chunk, chunks)) # 合并所有块得到完整矩阵 feat_matrix = np.vstack(chunk_results)
额外优化提示
不要使用多线程做加载,Python多线程受GIL限制无法利用多核优势,IO密集+计算密集的场景用多进程效率更高。
内容的提问来源于stack exchange,提问作者Tim yuan
相关产品推荐
相关产品推荐

