读取csv文件的特定行

时间:2019-04-15 16:15:48

标签: python multiprocessing

你们好, 所以我有一个巨大的CSV文件(500K行),我想用4个进程同时处理该文件(因此每个进程将读取aprox。100K行) 使用多处理的最佳方法是什么?

直到现在我要干什么:

def csv_handler(path, procceses = 5):

    test_arr = []
    with open(path) as fd:
        reader = DictReader(fd)

        for row in reader:
            test_arr.append(row)

    current_line = 0
    equal_length = len(test_arr) / 5

    for i in range(5):
        process1 = multiprocessing.Process(target=get_data, args=(test_arr[current_line: current_line + equal_length],))
        current_line = current_line + equal_length

我知道用一条阅读线做到这一点是不明智的做法,但我找不到其他选择。 我很乐意获得一些更好的方法的想法!

1 个答案:

答案 0 :(得分:0)

CSV是一种非常棘手的格式,用于拆分读取,其他文件格式可能更理想。

基本问题是,由于行的长度可能不同,因此您不知道从何处开始轻松读取特定行以使其“ fseek”。您必须浏览整个文件并计算换行符,基本上就是读取它。

但是您可以很接近这听起来足以满足您的需求。说两部分,取文件大小,然后除以2。

  • 您从零开始的第一部分,在file_size / 2完成记录后在 后停止。
  • 第二部分,您寻求file_size / 2,寻找下一行新内容,然后从那里开始。

这样,虽然Python进程的数量不会完全相同,但它会非常接近,并且避免了进程间消息传递或多线程,并且避免了CPython可能使用的全局解释器锁定。


当然,用于优化文件IO或Python代码的所有正常情况仍然适用(取决于瓶颈所在。您需要对此进行衡量。)