【问题标题】:Python - Efficient way to read large amounts of tabular dataPython - 读取大量表格数据的有效方法
【发布时间】:2019-09-16 17:21:12
【问题描述】:

我有一个文件,其中包含一个大的数字表,大小约为 300 MB。我想用 Python 读这个。

数据如下所示:

-200 1 11097.4 16414.2 1
-200 1 11197.4 16414.8 1
-200 1 11297.4 16415.4 1
-200 1 11397.4 16416 1
-200 1 11497.4 16416.5 1
-200 1 11597.4 16417.1 1
-200 1 11697.4 16417.7 1

Python 代码如下所示:

    with open(filename) as f:
        nrow, ncol= [int(x) for x in next(f).split()] 
        for k in range(2):
            rr = []
            for i in range(nrow+1):
                row = []
                for j in range(ncol+1):
                    a = next(f).split()                     
                    row.append([int(a[0]), int(a[1]), float(a[2]), float(a[4])])
                rr.append(row)          
            summary.append(rr)

这很慢;读取文件大约需要 60 秒。我想把它缩短到不到 10 秒。让它更快一点的最简单方法是什么?

如果有帮助,我非常乐意更改数据文件格式。

【问题讨论】:

  • 你看过熊猫吗?
  • 从来没有听说过熊猫,会google,谢谢!
  • 我认为您可能在所有这三个嵌套循环中都读错了数据。您从文件的第一行读取的值 nrowncol 是什么?
  • 没错,表格是2*nrow*ncol条目,每个条目一行写5个数字。
  • 好的,如果你确定

标签: python optimization


【解决方案1】:

使用熊猫。这可能是重复的,所以也请查看这些答案

code.py

​​>
import pandas as pd
import numpy as np

df = pd.read_csv("large_file.txt", sep="\s")
np.save("large_file.npz", df.values)

with load('large_file.npz') as data:
    print(data.shape)

【讨论】:

  • 我非常感谢您的回复,但不幸的是,读取文件仍然需要很长时间(几分钟)。主要是解析是一个问题,即使在 C 中也需要很长时间,除非我将数据格式更改为二进制格式。 python中是否有等效或类似的解决方案?
  • 如果你想同时在内存中进行整个精简,那么这是你唯一的选择,如果你可以分部分读取它然后传入块大小。
  • 您也可以从多个内核读取它,但这个问题可能只是 I/O 限制。
  • 您可以尝试以不同的格式保存/加载。尝试使用 numpy 的保存和加载。您可以将 .values 保存到文件中,然后查看加载需要多长时间。
  • 似乎 numpy 内存不足。
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2013-03-07
相关资源
最近更新 更多