面试题答案
一键面试分块读取
- 原理:将大文件分成小块逐块读取,每次只在内存中处理一小块数据,避免一次性将整个大文件读入内存。例如,
pd.read_csv('large_file.csv', chunksize = 1000)
,这里chunksize
指定了每块数据的行数为1000 。这样每次处理的数据量大大减少,从而降低内存压力。
按需选择列
- 原理:只读取需要的列,而不是读取文件中的所有列。如果文件有很多列,而实际只需要其中几列进行操作,那么不读取其余列可以显著减少内存占用。例如,
pd.read_csv('large_file.csv', usecols = ['col1', 'col2'])
,usecols
参数指定只读取col1
和col2
列 。
数据类型优化
- 原理:CSV文件默认会将数据以对象类型读入,而对象类型通常会占用较多内存。根据数据实际情况,将列转换为合适的、占用内存较少的数据类型。例如,如果某列是整数且范围不大,可以将其数据类型从默认的
object
转换为np.int8
。例如df['col'] = df['col'].astype('int8')
,int8
比默认的对象类型占用内存小很多。
筛选和聚合过程优化
- 原理:在分块读取的基础上,在每一块数据上直接进行筛选和聚合操作,而不是将所有块的数据读取完再操作。比如,对于筛选操作,在每一块读取的数据
chunk
上执行chunk = chunk[chunk['condition']]
,对于聚合操作可以使用chunk.groupby('col')['value'].sum()
。这样在内存中始终只有一块数据在进行操作,避免了大量中间数据的存储。
及时释放内存
- 原理:在不再需要某些数据时,及时使用
del
语句删除相关变量,让Python的垃圾回收机制回收内存。例如,在处理完一块数据chunk
后,如果后续不再需要,可以使用del chunk
,以释放这部分内存空间供其他操作使用。