【问题标题】:Python: which is the best way to read large .csv file?Python:读取大型 .csv 文件的最佳方式是什么?
【发布时间】:2017-04-15 02:50:09
【问题描述】:

我必须阅读大约20MB 的大.csv。这些文件是由8 列和5198 行组成的表。我必须对特定列 I 进行一些统计。

我有 n 不同的文件,这就是我正在做的事情:

stat = np.arange(n)
    I = 0
    for k in stat:
        df = pd.read_csv(pathS+'run_TestRandom_%d.csv'%k, sep=' ')
        I+=df['I']
    I = I/k ## Average

这个过程需要0.65s,我想知道是否有最快的方法。

【问题讨论】:

  • 也许尝试在pd.read_csv中指定memory_map=True
  • - 如果数据完全是数字,则无需使用 csv 模块。您可以使用 split。 - 使用字典访问记录字段有一些小的开销。您可以改为在 csv 的标题上使用 find,然后使用该索引从拆分记录中获取项目。
  • 第一行虽然不是数字,但是可以用split吗?
  • 20MB 不是大文件。 20GB 是更大的文件。
  • @furas:这是我的想法。除此之外,根据磁盘碎片,读取 20 MB 文件所需的 0.65 秒可能接近磁盘的限制(最后我检查,即使对于连续数据,大多数旋转磁盘的最高速度都低于 100 MB/s,所以冷读,您预计至少需要 0.2 秒的阅读时间,如果是零散的则更多,忽略所有处理成本)。 编辑:现在桌面级驱动器的峰值似乎接近 150 MB/s,笔记本电脑驱动器的峰值在 70-100 MB/s 范围内。即便如此,碎片化可以轻松地将其减少 10 倍。

标签: python csv pandas io


【解决方案1】:

编辑:显然这是一个非常糟糕的方法!不要做我猜的:/

我现在正在使用大约相同大小的数据集解决类似的问题。我使用的方法是numpy的genfromtxt

import numpy as np

ary2d = np.genfromtxt('yourfile.csv', delimiter=',', skip_header=1,
    skip_footer=0, names=['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8'])

在我的系统上,总共需要大约 0.1 秒

这样做的一个问题是,任何非数字的值都简单地被 nan 替换,这可能不是你想要的

【讨论】:

  • 鉴于 genfromtxt is slower than read_csv 并且它实际上并不支持真正的 CSV(, 的分隔符与包含引用、转义等的正确 CSV 不同),我'我不确定这会有什么帮助。 read_csv 正确执行 CSV,并且针对 CSV 进行了优化,其中 genfromtxt 是错误的并且是通用的(阅读:可能比专用代码慢),所以 genfromtxt 是错误的方法。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2010-09-13
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多