如何加快读取多个文件并将数据放入数据帧?

23 浏览
0 Comments

如何加快读取多个文件并将数据放入数据帧?

我有一些文本文件,比如50个,我需要将它们读入一个巨大的数据框中。目前,我正在使用以下步骤。

  1. 读取每个文件并检查标签是什么。我需要的信息通常包含在前几行中。相同的标签在文件的其余部分重复出现,每次都有不同类型的数据列出。
  2. 创建一个带有这些标签的数据框。
  3. 再次读取文件并填充数据框中的值。
  4. 将该数据框与主数据框连接。

对于100KB大小的文件,这个方法效果还不错 - 几分钟就可以完成,但对于50MB的文件,需要数小时,并且不切实际。

如何优化我的代码?特别是 -

  1. 我如何确定哪些函数占用了最多的时间,我需要优化?是读取文件的时间吗?是写入数据框的时间吗?我的程序在哪里花费了时间?
  2. 我应该考虑多线程或多进程吗?
  3. 我能改进算法吗?

    • 也许一次将整个文件读入列表,而不是逐行读取,
    • 按块/整个文件解析数据,而不是逐行解析,
    • 一次按块/整个文件将数据分配给数据框,而不是逐行分配。
  4. 还有其他什么我可以做来加快代码的执行速度吗?

这是一个示例代码。我的真实代码稍微复杂一些,因为文本文件更复杂,所以我必须使用大约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

0