访问非常大的 csv 文件都有哪些不同的方法?
Posted
技术标签:
【中文标题】访问非常大的 csv 文件都有哪些不同的方法?【英文标题】:What are the different ways to access really large csv files?访问非常大的 csv 文件有哪些不同的方法? 【发布时间】:2019-06-09 09:40:08 【问题描述】:我一直在从事一个项目,我必须尽可能快地读取和处理具有数百万行的非常大的 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 中读取文件的速度如此之快?
【问题讨论】:
">
"?为什么?
存储它们或将它们推送到数据库中,例如 mysql、sqlite、MS SQL。当它们在数据库中时更容易使用。
顺便说一句,os.system
应该避免;现在最好使用subprocess
module。但是对于这里给出的任务,肯定有可以在没有 shell 调用的情况下使用的原生函数。
在数据库中存储数据需要很长时间。对于独立应用程序,要处理大量行的数据,我发现 pandas 读取 csv 方法是最快的。但是,根据博文,使用 os 方法的时间要少得多。我想知道它是如何工作的,是否可以在通过 os.system 读取数据时访问数据。您可以在提到的博文中找到详细信息。
wc 和 catDevNull 方法很快,因为它们不会尝试正确解析 csv 文件。 wc 仅解析行,但不解析逗号。当您实际尝试将文件解析为数据结构时,您必须为结构分配空间并处理转义字符和引号。我同意其他人的建议,将其转储到数据库中。初始加载到数据库可能不会比读取到 csv 快,但是当您真正开始需要处理数据时它会快得多,因为您可以创建索引来加速进一步的访问和操作。
【参考方案1】:
os.system
完全放弃了您在 Python 中的控制权。子进程完成后,无法访问子进程中发生的任何事情。
对子进程进行一些(但不够)控制的更好方法是使用 Python subprocess
模块。这允许您使用信号和 I/O 与正在运行的进程进行交互,但仍然无法影响进程的内部,除非它具有允许您这样做的特定 API。 (如果您想探索,Linux 会在 /proc
文件系统中公开一些进程内部结构。)
我认为您不了解基准测试的含义。 cat >/dev/null
是一个基线,它简单地衡量系统读取磁盘文件的速度;您的进程不可能比 I/O 通道允许的更快,所以这是系统什么都不做的时间。在比较它们的相对性能之前,您基本上会从后续结果中减去这段时间。
通常,读取大文件的绝对最快的方法是对其进行索引,然后使用内存中的索引来查找要访问的文件内的位置。构建索引会产生一些开销,但如果您多次访问文件,好处很快就会抵消开销。将文件导入数据库是一种方便且友好的方式;数据库完全封装了 I/O,让您可以查询数据,就好像您可以忽略它在后台以某种方式序列化为磁盘上的字节一样。
【讨论】:
我完全同意这个评论。将一个巨大的 csv 文件导入数据库并进行查询,速度很快,并且为您提供了很大的查询逻辑灵活性。 虽然the alot 通常不具备灵活性。有一种用啤酒罐做的,很受欢迎。 这是一个很好的方法。在进一步的实验中,我发现索引文件的最佳方法是使用 pandas 数据帧而不是使用 sql,因为查询和存储的速度很快 如果这解决了您的问题,请考虑接受。您也可以发布自己的答案并接受。另见help.【参考方案2】:根据我的测试。我发现在 pandas 数据帧中查询比在数据库中查询要快得多[针对 sqlite3 进行了测试]
因此,最快的方法是将csv作为pandas数据帧,然后根据需要在数据帧中查询。另外,如果我需要保存文件,我可以腌制数据框,并根据需要重用它。与将数据存储在 sql 中然后查询结果相比,pickle 和 unpickle 文件和查询的时间要少得多。
【讨论】:
以上是关于访问非常大的 csv 文件都有哪些不同的方法?的主要内容,如果未能解决你的问题,请参考以下文章
我正在使用 C# 将 XML 文件转换为 CSV。我尝试了不同的方法,但无法弄清楚如何访问键名/值对
Win32 API 事件 - 它在跨不同进程的访问方面都有哪些限制?