我正在访问一个包含超过2000万行和200多列的大型CSV文件。
我的代码在以下部分花了太多时间:
def Myfunction(df):
if df['3.3'] == 1 or df['2.3'] == 1 or df['1.3'] == 1 or df['4'] == 1:
df['A1'] = 'A1'
df['AZ B1'] = df[basic_clean('AZ col')]
df['CZ Cat'] = df[basic_clean('Cate name')]
df['CZ Sub'] = df[basic_clean('SubName')]
df['CZ Com'] = df[basic_clean('Comm_Name')]
else:
df['A1'] = 'Not A1'
df['AZ B1'] = df[basic_clean('Fam name')]
df['CZ Cat'] = df[basic_clean('C Name')]
df['CZ Sub'] = df[basic_clean('Sub Name')]
df['CZ Com'] = df[basic_clean('C Name')]
return df
这里,basic_clean()
是一个函数,它将文本格式化(大写),不需要太多时间。我在某处读到了使用并行化pandas数据帧的方法,但对此没有任何好的材料。
答案 0 :(得分:0)
在上述用例中,最好的改进将来自最初的一次性预转换所述CSV
- 文件-A到CSV
- 文件-B。在大多数情况下,基于“流”的大文件处理将更快,因为所有转换流 - “对齐”并且文件IO-“对齐”并且流处理将展示最小化的文件IO /数据流开销(无论是旋转磁盘,SSD,NAS还是其他类型的远程文件访问)。此步骤的良好实施可以保证最小的进程延迟,并且还可以有效地屏蔽转换后的文件后处理进程(导入程序)中的大部分步骤延迟。
(已经在巨大的telco-CDR-stream处理中使用了这种方法(比一些〜[2E+7,2E+2]
文件的扩展方式更大,所以可以肯定我可以比较好,更好,只是 - 大规模和差的方法))
完成了预转换步骤后,python-side将不再承担任何此类块工作负载,只会处理从“正确”预格式化CSV
- file-B导入的数据帧。
文件IO绑定操作的并行性在大多数情况下都无济于事,因为IO延迟极高(对于fileIO而言为~10 + [ms]而不是CPU / MEM-IO的〜[ns]),数据流带宽无法控制,由于容易资源争用(阻塞)。