Python 访问真正大的csv文件有哪些不同的方法?

Python 访问真正大的csv文件有哪些不同的方法?,python,pandas,algorithm,large-data,data-processing,Python,Pandas,Algorithm,Large Data,Data Processing,我一直在做一个项目,在这个项目中,我必须以尽可能快的速度读取和处理数百万行的非常大的csv文件 我看到了这个链接:作者对访问csv的不同方式以及每个步骤所用的时间进行了基准测试。 他使用了catdevnull流程,代码如下所示: def catDevNull(): os.system('cat %s > /dev/null' % fn) def wc(): os.system('wc -l %s > /dev/null' % fn) 在这种情况下所花费的时间最少。

我一直在做一个项目,在这个项目中,我必须以尽可能快的速度读取和处理数百万行的非常大的csv文件

我看到了这个链接:作者对访问csv的不同方式以及每个步骤所用的时间进行了基准测试。 他使用了catdevnull流程,代码如下所示:

def catDevNull():
    os.system('cat %s > /dev/null' % fn)
def wc():
    os.system('wc -l %s > /dev/null' % fn)
在这种情况下所花费的时间最少。我相信它独立于python版本,因为读取文件所花费的时间保持不变。然后他使用warmc ache方法,如图所示:

def catDevNull():
    os.system('cat %s > /dev/null' % fn)
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中读取文件的速度比上面链接中显示的其他可用方法快得多?

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

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

我想你不明白基准是什么意思。
cat>/dev/null
是一个基准,它只是测量系统能够从磁盘读取文件的速度;您的进程不可能快于I/O通道允许的速度,因此这是系统完全不执行任何操作所需的时间。在比较它们的相对性能之前,您基本上会从后续结果中减去这一时间


按照惯例,读取大文件最快的方法是为其编制索引,然后使用内存中的索引查找到要访问的文件中的位置。构建索引会导致一些开销,但是如果您多次访问该文件,其好处很快就会抵消开销。将文件导入数据库是一种方便、友好的方法;数据库完全封装了I/O并允许您查询数据,就好像您可以忽略数据在幕后以某种方式序列化为磁盘上的字节一样。

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

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

我想你不明白基准是什么意思。
cat>/dev/null
是一个基准,它只是测量系统能够从磁盘读取文件的速度;您的进程不可能快于I/O通道允许的速度,因此这是系统完全不执行任何操作所需的时间。在比较它们的相对性能之前,您基本上会从后续结果中减去这一时间


按照惯例,读取大文件最快的方法是为其编制索引,然后使用内存中的索引查找到要访问的文件中的位置。构建索引会导致一些开销,但是如果您多次访问该文件,其好处很快就会抵消开销。将文件导入数据库是一种方便、友好的方法;数据库完全封装了I/O,并允许您查询数据,就好像您可以忽略数据在幕后以某种方式序列化为磁盘上的字节一样。

基于我的测试。我发现,在pandas数据帧中查询要比在数据库中查询快得多[针对sqlite3进行了测试]


因此,最快的方法是获取csv作为数据帧,然后根据需要在数据帧中进行查询。此外,如果需要保存文件,我可以对数据帧进行pickle,并根据需要重用它。pickle和unpickle文件和查询的时间比将数据存储在sql中然后查询结果要短得多。

根据我的测试。我发现,在pandas数据帧中查询要比在数据库中查询快得多[针对sqlite3进行了测试]


因此,最快的方法是获取csv作为数据帧,然后根据需要在数据帧中进行查询。此外,如果需要保存文件,我可以对数据帧进行pickle,并根据需要重用它。pickle和unpickle文件和查询的时间比将数据存储在sql中然后查询结果要短得多。

&;gt;”
”?为什么?将它们存储或推送到数据库中,例如mysql、sqlite、MS SQL。当它们在数据库中时更容易使用。顺便说一句,应该避免使用
os.system
;现在使用
子流程
模块要好得多。但是对于这里给出的任务,肯定有一些本机函数可以通过shell调用来使用。将数据存储在数据库中需要很多时间。对于一个独立的应用程序,要处理包含大量行的数据,我发现pandas read csv方法是最快的。但是,根据博文,使用o