我有大量的文本文件,比如说50,我需要读入大量的数据框。目前,我正在使用以下步骤。如何加速读取多个文件并将数据放入数据框?
- 阅读每个文件,并检查标签是什么。我需要的信息通常包含在前几行中。相同的标签只是为文件的其余部分重复使用,每次都会针对它们列出不同类型的数据。
- 用这些标签创建一个数据框。
- 再次读取该文件,并用值填充数据帧。
- 将数据帧与主数据帧连接起来。
这对于100 KB大小的文件非常适用 - 几分钟,但在50 MB,它只需要几个小时,并且不实际。
如何优化我的代码?特别是 -
- 如何确定哪些功能需要最多时间,哪些需要优化?它是文件的阅读吗?这是写入数据框吗?我的计划在哪里花费时间?
- 我应该考虑多线程还是多处理?
- 我可以改进算法吗?
- 或许读取整个文件在一个进入名单,而不是一行一行,在块/整个文件
- 解析数据,而不是一行行,
- 分配数据到数据帧块/一个去,而不是逐行。
- 有什么我可以做,让我的代码更快执行?
下面是一个示例代码。我自己的代码稍微复杂一点,因为文本文件比较复杂,所以我必须使用大约10个正则表达式和多个while循环来读取数据并将其分配到正确数组中的正确位置。为了保持MWE简单,我还没有在MWE的输入文件中使用重复标签,所以它会让我无故读取文件两次。我希望这是有道理的!
import re
import pandas as pd
df = pd.DataFrame()
paths = ["../gitignore/test1.txt", "../gitignore/test2.txt"]
reg_ex = re.compile('^(.+) (.+)\n')
# read all files to determine what indices are available
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)
# read files again and put data into a master dataframe
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
可能会得到一个更快的磁盘:) –
在此期间,查找一个好的Python分析器。这是一般工具类,它会告诉你程序的哪一部分是瓶颈。 –
你不能读取数据框中的整个50个文件,然后运行基于正则表达式的操作?这将是快速的,因为对熊猫的过滤操作非常快...... – vks