Python .close()在Linux和Window上的执行情况不同

时间:2018-11-22 16:03:00

标签: python linux pandas performance operating-system

所以我写了一些代码来创建一个训练集,我要做的基本上是读取大约一百万个文件,其中每个文件都包含一个不太长的句子,然后进行一些处理,然后将处理后的句子写到csv文件中

这是我的主要功能:

如果名称 =='主要':

rootpath = 'F:\....'
outpath = "F:\..."

file_list = read_sentences(rootpath)

for each_file_name in file_list:

    file_path = rootpath + each_file_name
    df = np.array([['sentences', 'event', 'cues', 'outcomes(variant)', 'morph_tag', 'filename']])
    try:
        file_textgrid_obj = textgrid.TextGrid.fromFile(file_path)
        a_sentence = Sentences()
        a_sentence.read_from_textgrid(file_textgrid_obj)
        create_event(a_sentence, each_file_name)
        df_np = create_cues(a_sentence,df, each_file_name)
        df = pd.DataFrame(df_np, columns=['sentences', 'event', 'cues', 'outcomes(variant)', 'morph_tag', 'filename'])
        df.to_csv(outpath + "os.csv", sep=",", mode='a', header=False)
    except UnicodeDecodeError:
        print(each_file_name + ': the encode is weird, not utf-8 or ansi')`

我在Linux和Windows机器上都运行了相同的代码,结果我的Windows机器完成了5到6个小时的工作(起初它有点快,而且越来越慢),但是在我的机器上linux机器,花了4分钟。

这是有关我的两台机器的一些基本信息:

Windows机器:HP Pavilion,Intel®Core™i5-8300H Prozessor(bis zu 4 GHz),四核,8G RAM,Windows 10 Home 64位;

Linux机器:Acer TravelMate-B117,Intel®Celeron(R)CPU N3160 @ 1.60GHz×4、4G RAM,Ubuntu 18.04.1 LTS;

因此您可以看到我的Windows机器比linux机器好得多,所以我确定它与硬件无关。

而且,我一直记录下来,发现df.to_csv(outpath + "os.csv", sep=",", mode='a', header=False)花费的时间最长,并且随着csv文件的增加,它变得更慢。

之后,我查看了to_csv()中的pandas函数,发现如果对文件的字符串路径进行了解析,则该函数将在每次新的csv文件关闭后关闭它。附加了一行,但是如果已打开的文件被解析到该文件,则它将保持打开状态。这是一个与我一样遇到类似问题的家伙:Performance: Python pandas DataFrame.to_csv append becomes gradually slower,根据他的修剪,它正在关闭耗时最长的文件。因此,我更改了代码,并使文件始终打开,并且可以正常工作!它在Windows上的运行速度与在Linux上一样快。

但是问题是,在我更改代码之前,即使在每次添加句子后也必须关闭文件的情况下,它在Linux上仍然运行非常快。为什么???我的猜测也许是因为当python在Linux上执行close()时,数据只是从运行时缓冲区刷新到系统缓冲区,而不是写入磁盘,而在Window上,数据是否每次也都写入磁盘吗? ?

我不确定我的猜测是否正确,因为当我在Linux上运行代码时,我总是可以打开磁盘上的文件并将其检出,并且可以看到文件的大小正在扩大。

所以也许有人可以向我解释为什么在Windows上用python关闭一个大文件比在Linux上花费更长的时间?

谢谢!

0 个答案:

没有答案