所以我写了一些代码来创建一个训练集,我要做的基本上是读取大约一百万个文件,其中每个文件都包含一个不太长的句子,然后进行一些处理,然后将处理后的句子写到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上花费更长的时间?
谢谢!