Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python多处理将csv转换为json_Python_Python Multiprocessing_Csvtojson - Fatal编程技术网

使用python多处理将csv转换为json

使用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

我有大约30个csv文件,我正在尝试将其并行转换为json。 转换正在发生,但需要相当长的时间。大约25分钟。 每个文件将有200万条记录。下面是我的代码。我是python新手,您能否建议一些可能的方法来调优代码,以加快转换速度

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,未安装在我们的系统中。