【发布时间】:2020-09-10 21:19:16
【问题描述】:
我在子目录中有大约 20000 个文档。我想全部阅读它们并将它们附加为一个列表列表。到目前为止,这是我的代码,
topics =os.listdir(my_directory)
df =[]
for topic in topics:
files = os.listdir (my_directory+ '/'+ topic)
print(files)
for file in files:
print(file)
f = open(my_directory+ '/'+ topic+ '/'+file, 'r', encoding ='latin1')
data = f.read().replace('\n', ' ')
print(data)
f.close()
df = np.append(df, data)
但是这样效率低下,并且需要很长时间才能读取它们并将它们附加到 df 列表中。我的预期输出是,
df= [[doc1], [doc2], [doc3], [doc4],......,[doc20000]]
上面的代码我跑了6个多小时还是没写完(大概做了一半的文档)。如何改代码让它更快?
【问题讨论】:
-
我注意到您已将此标记为“机器学习”,因此我不会准确回答您的问题,但会给出一些建议。将所有数据同时加载到内存中通常是不好的做法,尤其是因为您可以在进行其他计算时执行读取。您应该使用多处理模块来利用另一个核心来收集下 N 个批次,而您的模型正在计算梯度(或其他任何操作)。否则,您的代码看起来不错(可以使用上下文管理器进行改进),但需要多线程。
-
顺便说一句,由于
df = np.append(df, data)在循环之外,所以除了最后一个data之外,您将把所有东西都扔掉。 -
打开 20 000 个文本文件本身就需要很多时间。也许您可以编写一个单独的代码,将它们转换为 100 个 csv 文件,这样读取速度会快很多?
-
删除循环中的
print(data)调用。打印内容会花费令人惊讶的长时间滚动,如果您在 IDE 或终端以外的其他工具中运行脚本,则速度可能会更慢。 -
这些文件有多大,您是否有足够的 RAM 来保存它们?读取足够的数据以淹没您的 RAM 应该不需要几个小时。在某些时候,您可能会开始破坏交换文件,但最终它会全部崩溃。