繁体   English   中英

阅读csv文件的特定行

[英]Read specific lines of csv file

Hllo伙计们,所以我有一个巨大的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

我知道用一条阅读线来做这件事是不好的,但我没有找到另一种选择..我很乐意以更好的方式得到一些想法!

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

基本问题是,由于线条长度可能不同,因此无法知道从哪里开始轻松读取特定线条以“ fseek ”。 您必须扫描计算换行符的文件,基本上是读取它。

但是你可以非常接近,听起来它足以满足你的需求。 比如两个部分,取文件大小,除以2。

  • 第一部分从零开始, 完成file_size / 2的记录停止。
  • 第二部分,你寻找file_size / 2 ,寻找下一个新行,并从那里开始。

这种方式虽然Python进程不会全部获得完全相同的数量,但它将非常接近,并避免过多的进程间消息传递或多线程,并且CPython可能是全局解释器锁。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM