Python脚本中的多线程技术

2024-09-30 14:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我几乎没有以numpy.arrays数组向量和字典。我们把它们称为D,i,i=1..4。除此之外,我还有一个csv文件F1.csv,它只有一列。你知道吗

我已经编写了一个python代码p,它将读取F1.csv中的行。对于每一行,使用Di上的读取操作,它将生成一些必须写入F2.csv的数据。这段代码运行良好,并给出了预期的结果。你知道吗

然而,Di是巨大的,并且p仅使用一个CPU核。如何让P使用两个内核--一个内核用于F1.csv的上半部分,另一个用于下半部分?你知道吗

我的代码太复杂,无法在这里编写,因此我给出了一个玩具版本:

# Code for generating D1
  ...
# Code for generating D2
  ...
# Code for generating D3
  ...
# Code for generating D4
  ...

# P starts

F1 = csv.reader(open('data/F1.csv'), delimiter='\t')
F2 = open('data/F2.csv', 'wb')

for row in F1:
    toBeWritten = { ... some read operations on Di ... } #detailed code is given below in Edit 2

    F2.write(toBeWritten)

# P ends

如何修改“#p start”和“#p ends”之间的代码,以便线程从F1.csv中读取不相交的行,计算以独立写入,然后写入F2.csv?你知道吗

我是Python多线程的新手,因此如果能给出一个简单地修改代码以完成任务的答案,我将不胜感激。你知道吗

编辑1:

请注意,瓶颈是生成与F2的每一行相对应的待写入D1是一个1.5M x 1.3M的稀疏矩阵,读作scipy.sparse.lil\u矩阵. 生成以编写需要添加此矩阵的一些行。这是真正的罪魁祸首!你知道吗

编辑2:

下面的代码中包含了生成以编写的实际代码。你知道吗

# D1 is a 1.5M x 1.3M sparse matrix, read as scipy.sparse.lil_matrix.
# D2 is a 1.5M x 111 matrix, read as numpy.array
# for row in F1:
    user_id = row[0]
    clust = D2[user_id, 110]
    neighbors = D2[ D2[:, 110] == clust][:,1]
    score = np.zeros(1300000)

    for neigh in neighbors:
        score = score + D1 [neigh, :] # the most expensive operation

    toBeWritten = np.argsort(score)[:,::-1].A[0,:]

Tags: csv代码inforreadcoderowf2
1条回答
网友
1楼 · 发布于 2024-09-30 14:28:14

不确定线程是否可以帮助您解决特定的问题,但您可以这样做:

# Code for generating D1
  ...
# Code for generating D2
  ...
# Code for generating D3
  ...
# Code for generating D4
  ...

# P starts

with open('data/F1.csv', 'rb') as csv_file, open('data/F2.csv', 'wb') as F2:
    F1 = csv.reader(csv_file, delimiter='\t')
    result = list()

    def do_work(lines):
        for line in lines:
            toBeWritten = { ... some read operations on Di ... }
            result.append(toBeWritten)

    data = list(F1)
    t0 = threading.Thread(target=do_work, args=(data[:len(data)/2], ))
    t1 = threading.Thread(target=do_work, args=(data[len(data)/2:], ))
    t0.start()
    t1.start()
    t0.join()
    t1.join()

    for line in result:
        F2.write(line)

# P ends

如果线程没有帮助,您可能需要尝试多处理。你知道吗

相关问题 更多 >