使用python多处理将csv转换为json
我有大约30个csv文件,我正在尝试将其并行转换为json。 转换正在发生,但需要相当长的时间。大约25分钟。 每个文件将有200万条记录。下面是我的代码。我是python新手,您能否建议一些可能的方法来调优代码,以加快转换速度使用python多处理将csv转换为json,python,python-multiprocessing,csvtojson,Python,Python Multiprocessing,Csvtojson,我有大约30个csv文件,我正在尝试将其并行转换为json。 转换正在发生,但需要相当长的时间。大约25分钟。 每个文件将有200万条记录。下面是我的代码。我是python新手,您能否建议一些可能的方法来调优代码,以加快转换速度 import csv import json import os import multiprocessing as mp path = '<some_path>' """ Multiprocessing module to generate jso
import csv
import json
import os
import multiprocessing as mp
path = '<some_path>'
""" Multiprocessing module to generate json"""
total_csv_file_list = []
for filename in os.listdir(path):
total_csv_file_list.append(os.path.join(path,filename))
total_csv_file_list = list(filter(lambda x:x.endswith('.csv'), total_csv_file_list))
total_csv_file_list = sorted(total_csv_file_list)
print(total_csv_file_list)
def gen_json (file_list):
csvfile = open(file_list, 'r')
jsonfile = open((file_list.split('.')[0]+'.json'), 'w')
fieldnames = ("<field_names")
reader = list(csv.DictReader( csvfile, fieldnames))
json.dump(reader, jsonfile,indent=4)
try:
p_json = mp.Pool(processes=mp.cpu_count())
total_json_file_list = p_json.map(gen_json,total_csv_file_list)
finally:
p_json.close()
p_json.join()
print("done")
导入csv
导入json
导入操作系统
将多处理作为mp导入
路径=“”
“”“用于生成json的多处理模块”“”
总csv文件列表=[]
对于os.listdir(路径)中的文件名:
total_csv_file_list.append(os.path.join(path,filename))
total_csv_file_list=list(过滤器(lambda x:x.endswith('.csv'),total_csv_file_list))
总csv文件列表=已排序(总csv文件列表)
打印(总csv文件列表)
def gen_json(文件列表):
csvfile=open(文件列表'r')
jsonfile=open((文件_list.split('.')[0]+'.json'),'w')
fieldnames=(“停留在纯python中-不太多,也没有必要考虑到所需的复杂性和获得的速度
尝试使用比可用内核少一个工作线程。操作系统仍然可以在空闲内核上完成它的任务。因此,应该减少程序的上下文切换
由于您对结果不感兴趣,map\u async
可能比map
更快。您不从该函数返回任何内容,但在map
返回结果时仍有一些开销
仔细检查您是否没有达到内存限制,操作系统是否没有开始交换到磁盘。不确定DictReader和json是否会将文件完全加载到内存中,或者是否会进行缓冲。
如果交换是个问题,那么您需要自己进行缓冲和块写入
使用纯python时,还可以尝试利用asyncio,但这需要自定义分块和自定义生产者-消费者代码
具有多个事件循环的队列-每个使用者1个
Cython可以实现真正的速度增益。使用规范化的c类型字段为行数据定义一个类。使用纯reader读取csv并为每行创建定义类的对象。将此类类的列表序列化为json。这样的代码可以使用Cython编译为python c扩展。即使没有正确的类型,Cython也可以编译python代码的速度大约是python的两倍,停留在纯python中-不多,并且没有必要考虑到所需的复杂性和获得的速度
尝试使用比可用内核少一个工作线程。操作系统仍然可以在空闲内核上完成它的任务。因此,应该减少程序的上下文切换
由于您对结果不感兴趣,map\u async
可能比map
更快。您不从该函数返回任何内容,但在map
返回结果时仍有一些开销
仔细检查您是否没有达到内存限制,操作系统是否没有开始交换到磁盘。不确定DictReader和json是否会将文件完全加载到内存中,或者是否会进行缓冲。
如果交换是个问题,那么您需要自己进行缓冲和块写入
使用纯python时,还可以尝试利用asyncio,但这需要自定义分块和自定义生产者-消费者代码
具有多个事件循环的队列-每个使用者1个
Cython可以实现真正的速度增益。使用规范化的c类型字段为行数据定义一个类。使用纯reader读取csv并为每行创建定义类的对象。将此类类的列表序列化为json。这样的代码可以使用Cython编译为python c扩展。即使没有正确的类型,Cython也可以编译python code的速度大约快了两倍,您尝试过任何其他csv阅读器吗?我看到了它的良好性能。无法使用pandas,未安装在我们的系统中。您尝试过任何其他csv阅读器吗?我看到了它的良好性能。无法使用pandas,未安装在我们的系统中。