【问题标题】:large csv file makes segmentation fault for numpy.genfromtxt大型 csv 文件使 numpy.genfromtxt 出现分段错误
【发布时间】:2015-05-01 00:55:01
【问题描述】:

我真的很想从 csv 文件创建一个 numpy 数组,但是,当文件长约 50k 行时(如 MNIST 训练集),我遇到了问题。我尝试导入的文件如下所示:

0.0,0.0,0.0,0.5,0.34,0.24,0.0,0.0,0.0
0.0,0.0,0.0,0.4,0.34,0.2,0.34,0.0,0.0
0.0,0.0,0.0,0.34,0.43,0.44,0.0,0.0,0.0
0.0,0.0,0.0,0.23,0.64,0.4,0.0,0.0,0.0

它适用于 10k 行长的东西,比如验证集:

import numpy as np
csv = np.genfromtxt("MNIST_valid_set_data.csv",delimiter = ",")

如果我对训练数据(更大的文件)做同样的事情,我会得到一个 c 风格的分段错误。除了将文件分解然后拼凑之外,有谁知道更好的方法吗?

最终结果是我想将数组腌制到类似的mnist.pkl.gz 文件中,但如果我无法读取数据,我就无法这样做。

任何帮助将不胜感激。

【问题讨论】:

  • 这只有大约 450000 个浮点数,应该只需要大约 3.6MB,这在任何可以首先运行 NumPy 的平台上都不是问题,这让我觉得可能有问题你的 NumPy 安装。你有哪些 Python 和 NumPy 版本,你在什么平台上,你是如何安装它们的?
  • 如果您只是想要一种解决方法,可以动态地分解文件,而不是在磁盘上;只需 genfromtxt 对包含每批 10K 行的类文件对象,而不是对文件名(然后您可以将 stack 它们放在一个单行中)。但你不应该需要一个。
  • 另一种解决方法是使用 stdlib csv 模块将文件读入可迭代的行,并使用 fromiter 将其转换为箭头。那会慢很多……但谁在乎呢?

标签: python csv numpy pickle


【解决方案1】:

我认为您真的想追踪实际问题并解决它,而不是仅仅解决它,因为我敢打赌,您在 NumPy 安装中还有其他问题,您最终将不得不处理这些问题。

但是,由于您要求一种比手动拆分文件、读取文件和合并文件更好的解决方法,因此这里有两个:


首先,您可以以编程方式动态拆分文件,而不是手动拆分。这样可以避免浪费您自己的大量人力,还可以节省这些副本所需的磁盘空间,即使在概念上您已经知道该怎么做。

正如genfromtxt 文档所明确指出的,fname 参数可以是路径名,也可以是文件对象(以'rb' 模式打开),或者只是行生成器(如bytes)。当然,文件对象本身就是行的生成器,但例如,文件对象的islicegrouper 中的组也是如此。所以:

import numpy as np
from more_itertools import grouper

def getfrombigtxt(fname, *args, **kwargs):
    with open(fname, 'rb') as f:
        return np.vstack(np.genfromtxt(group, *args, **kwargs) 
                         for group in grouper(f, 5000, b''))

如果您不想安装more_itertools,您也可以从itertools 文档的Recipes 部分复制两行grouper 实现,或者甚至将迭代器直接内联压缩到您的代码。


或者,您可以使用 stdlib 的 csv 模块而不是 NumPy 解析 CSV 文件:

import csv
import numpy as np

def getfrombigtxt(fname, delimiter=','):
    with open(fname, 'r') as f: # note text mode, not binary
        rows = (list(map(float, row)) for row in csv.reader(f))
        return np.vstack(rows)

这显然会慢很多……但如果我们谈论将 50 毫秒的处理时间变成 1000 毫秒,而你只做一次,谁在乎呢?

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多