首页 > 解决方案 > 访问非常大的 csv 文件有哪些不同的方法?

问题描述

我一直在从事一个项目,我必须尽可能快地读取和处理具有数百万行的非常大的 csv 文件。

我遇到了链接:https ://nelsonslog.wordpress.com/2015/02/26/python-csv-benchmarks/ ,作者在其中对访问 csv 的不同方式以及每个步骤所花费的时间进行了基准测试。他使用了 catdevnull 进程和代码,如下所示:

def catDevNull():
    os.system('cat %s > /dev/null' % fn)

在这种情况下花费的时间是最少的。我相信它独立于 python 版本,因为读取文件所需的时间保持不变。然后他使用了 warmcache 方法,如下所示:

def wc():
    os.system('wc -l %s > /dev/null' % fn)

以上两种方法是最快的。pandas.read_csv用于任务,时间比其他方法少,但仍然比上述两种方法慢。

x = os.system('cat %s > /dev/null % fn), 并检查数据类型是一个字符串。

怎么os.system读取时间少了这么多的文件呢?另外,有没有办法在文件被读取后访问文件以os.system进行进一步处理?

我也很好奇,与上面链接中显示的其他可用方法相比,pandas 中读取文件的速度为什么要快得多?

标签: pythonpandasalgorithmlarge-datadata-processing

解决方案


os.system完全放弃了您在 Python 中的控制权。完成后,无法访问子流程中发生的任何事情。

对子进程进行一些(但不够)控制的更好方法是使用 Pythonsubprocess模块。这允许您使用信号和 I/O 与正在运行的进程进行交互,但仍然无法影响进程的内部,除非它具有允许您这样做的特定 API。/proc(如果您想探索,Linux 会在文件系统中公开一些进程内部结构。)

我认为您不了解基准的含义。这cat >/dev/null是一个基线,它简单地衡量系统从磁盘读取文件的速度;你的进程不可能比 I/O 通道允许的更快,所以这是系统什么都不做的时间。在比较它们的相对性能之前,您基本上会从后续结果中减去这段时间。

传统上,读取大文件的绝对最快的方法是对其进行索引,然后使用内存中的索引来查找要访问的文件内的位置。构建索引会产生一些开销,但如果您多次访问文件,好处很快就会抵消开销。将文件导入数据库是一种方便且友好的方式;数据库完全封装了 I/O 并让您查询数据,就好像您可以忽略它在幕后以某种方式序列化为磁盘上的字节一样。


推荐阅读