如何加快读取多个文件并将数据放入数据帧?
如何加快读取多个文件并将数据放入数据帧?
我有一些文本文件,比如50个,我需要将它们读入一个巨大的数据框中。目前,我正在使用以下步骤。
- 读取每个文件并检查标签是什么。我需要的信息通常包含在前几行中。相同的标签在文件的其余部分重复出现,每次都有不同类型的数据列出。
- 创建一个带有这些标签的数据框。
- 再次读取文件并填充数据框中的值。
- 将该数据框与主数据框连接。
对于100KB大小的文件,这个方法效果还不错 - 几分钟就可以完成,但对于50MB的文件,需要数小时,并且不切实际。
如何优化我的代码?特别是 -
- 我如何确定哪些函数占用了最多的时间,我需要优化?是读取文件的时间吗?是写入数据框的时间吗?我的程序在哪里花费了时间?
- 我应该考虑多线程或多进程吗?
- 我能改进算法吗?
- 也许一次将整个文件读入列表,而不是逐行读取,
- 按块/整个文件解析数据,而不是逐行解析,
- 一次按块/整个文件将数据分配给数据框,而不是逐行分配。
- 还有其他什么我可以做来加快代码的执行速度吗?
这是一个示例代码。我的真实代码稍微复杂一些,因为文本文件更复杂,所以我必须使用大约10个正则表达式和多个while循环来读取数据并将其分配到正确的位置和正确的数组中。为了保持MWE简单,我在输入文件中也没有使用重复的标签,所以看起来我为了没有理由而读取了文件两次。希望这样说得清楚!
import re import pandas as pd df = pd.DataFrame() paths = ["../gitignore/test1.txt", "../gitignore/test2.txt"] reg_ex = re.compile('^(.+) (.+)\n') # 读取所有文件以确定可用的索引 for path in paths: file_obj = open(path, 'r') print file_obj.readlines() ['a 1\n', 'b 2\n', 'end'] ['c 3\n', 'd 4\n', 'end'] indices = [] for path in paths: index = [] with open(path, 'r') as file_obj: line = True while line: try: line = file_obj.readline() match = reg_ex.match(line) index += match.group(1) except AttributeError: pass indices.append(index) # 再次读取文件并将数据放入主数据框 for path, index in zip(paths, indices): subset_df = pd.DataFrame(index=index, columns=["Number"]) with open(path, 'r') as file_obj: line = True while line: try: line = file_obj.readline() match = reg_ex.match(line) subset_df.loc[[match.group(1)]] = match.group(2) except AttributeError: pass df = pd.concat([df, subset_df]).sort_index() print df Number a 1 b 2 c 3 d 4
我的输入文件:
test1.txt
a 1 b 2 end
test2.txt
c 3 d 4 end