簡體   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