如何根据内容将大文件(5GB)分割成小文件?

时间:2018-12-18 12:46:23

标签: python json file

我有100个大文件,每个文件约5GB。 我需要根据其内容将其拆分为文件。 大文件有很多行,每一行都是这样

for i in [...]:
    try:
        func1(i)
    except Exception as ex:
        print(ex)
        func2(i)

我需要根据task_op_id分割内容,每个大文件都有350个不同的task_op_id,因此每个文件都应生成350个不同的小文件,每个文件都具有相同的task_op_id内容。

我尝试过的方法是:

{"task_op_id": 143677789, "task_op_time": 1530927931, "task_op_tag": 1, "create_time": 1530923701, "status": 2}

但是速度太慢,处理10GB数据需要2个小时。

那么有没有更好的方法来处理数据?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我推测主要的耗时过程是文件IO操作。您可以细分运行时间并检查一下吗?

另一个原因可能是JSON解析器。查看this线程以了解更多信息。

答案 1 :(得分:0)

您可以对这些文件进行排序吗? 如果是,请尝试不要将每一行都解析为JSON,而只能将其解析为新ID。

像这样吗?

def get_id(json_line): 
  data_dict = json.loads(json_line)
  return data_dict['task_op_id']

def split_to_id_file(original_file):
  current_id = 'blabla_xxxxxxxx'
  destination_file = 'processed_data2/data_over_one_id/break_into_ids/'
  with open(original_file) as f1:
    for line in f1:
        if current_id not in line:
          if not f2.closed:
            f2.close()
          task_op_id = get_id(line)
          current_id = "\"task_op_id\": " + task_op_id
          f2 = open(destination_file+str(task_op_id), 'a+')
        f2.write(line+'\n')