Python随机停止写入csv,但for循环仍然在运行

时间:2016-08-18 06:25:12

标签: python file csv multiprocessing python-multiprocessing

我正在尝试从Last.fm获取数据,并将这些数据写入CSV文件。我有一个.csv,根据这个a.csv的每一行,我从Last.fm获取其他数据,然后将它们保存到b.csv。因此,a.csv和b.csv的大小相同。

a.csv是一个包含大约800万条数据行的大型文本文件,因此我尝试运行多个进程,每个进程处理大约250,000行。

我尝试使用python多处理模块,我也试过运行多个终端。问题是大多数时候(大约9个中的10个或更多),进程随机停止写入每个CSV文件。

例如,我开始运行4个进程,它们通常会开始写入单独的CSV文件。然后,当随机时间过去时,很少有CSV文件不再被修改。有时其中一个CSV会在(几分钟左右)后立即停止我开始运行该过程,其他csvs也会在几个小时或几个小时后停止。这些模式是完全随机的,很少,所有过程都会成功完成,这就是为什么我无法弄清楚它们一直停止的原因。我在其他计算机上试过并没有区别,所以这个问题看起来并不依赖于计算资源。

此外,即使CSV文件停止被修改,该过程仍在运行,因为我使代码每1000条数据线打印到终端的进度。

以下是我的代码的整体结构(我只是编写了我认为以抽象形式理解程序必不可少的代码):

f_reader = csv.reader(f, delimeter=',')
# (same for other csv files needed ..)

for line in a.csv:
    if 1000 data lines are processed:
        print('1000 tracks processed')

    url = Lastfm API root url + selective data in line
    req = urllib2.Request(url) 
    response = urllib2.urlopen(req) # fetch data from Last.fm and save result to req
    info = etree.fromstring(response.read())

    temp1 = info.find('data1').text.encode('utf-8')
    temp2 = info.find('data2').text.encode('utf-8')
    temp = [temp1, temp2]

    for column in temp:
        f.write('%s;' % column)
    f.write('\n')
f.close()

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

尝试在某处添加f.flush()调用,例如,在1000行检查点中。也许文件只是被缓冲,而不是写入磁盘。例如,请参阅How often does python flush to a file?