numpy.genfromtxt是否会一次性读取文件全部内容?大文件内存优化咨询
关于numpy.genfromtxt()读取大文件的内存问题及替代方案
numpy.genfromtxt()的内存行为
numpy.genfromtxt()会一次性读取整个文件的全部内容并加载到内存中。因为它的设计目标是生成完整的numpy数组,必须将所有数据读入后完成解析、类型转换等操作,最终生成一个内存中的数组对象。对于6300万行的超大型文件,这种方式必然会占用大量内存,甚至可能触发内存不足的错误。
逐行/分块读取的替代方法
1. Python原生逐行读取+单行numpy处理
利用Python文件对象的迭代器特性,每次仅读取一行数据并处理,内存仅保留单行数据的占用:
import numpy as np with open("large.file.txt", "r") as f: for line in f: # 去除首尾空白并分割数据,转换为numpy数组 row_data = np.fromstring(line.strip(), sep=" ") # 在这里执行你的业务逻辑,比如计算、写入结果等
2. numpy.loadtxt()分块读取
使用numpy.loadtxt()的skiprows和max_rows参数,将文件分成固定大小的块逐批处理,内存占用由块大小决定:
import numpy as np chunk_size = 10000 # 可根据内存情况调整块大小 current_skip = 0 while True: # 读取当前块 chunk = np.loadtxt("large.file.txt", skiprows=current_skip, max_rows=chunk_size) # 若块为空,说明已读完所有数据 if chunk.size == 0: break # 处理当前块数据 # ... # 更新跳过的行数 current_skip += chunk_size
3. pandas分块读取(适合结构化数据)
如果你的文件是结构化数据,pandas.read_csv()的chunksize参数提供了更便捷的分块处理方式,处理后可转换为numpy数组:
import pandas as pd import numpy as np chunk_size = 10000 # sep参数根据你的文件分隔符调整,header=None表示无表头 for chunk in pd.read_csv("large.file.txt", sep=" ", chunksize=chunk_size, header=None): # 将pandas DataFrame转换为numpy数组 chunk_np = chunk.to_numpy() # 处理当前块数据 # ...
内容的提问来源于stack exchange,提问作者Redshoe
相关产品推荐
相关产品推荐

