【发布时间】: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应该避免;现在最好使用subprocessmodule。但是对于这里给出的任务,肯定有可以在没有 shell 调用的情况下使用的原生函数。 -
在数据库中存储数据需要很长时间。对于独立应用程序,要处理大量行的数据,我发现 pandas 读取 csv 方法是最快的。但是,根据博文,使用 os 方法的时间要少得多。我想知道它是如何工作的,是否可以在通过 os.system 读取数据时访问数据。您可以在提到的博文中找到详细信息。
-
wc 和 catDevNull 方法很快,因为它们不会尝试正确解析 csv 文件。 wc 仅解析行,但不解析逗号。当您实际尝试将文件解析为数据结构时,您必须为结构分配空间并处理转义字符和引号。我同意其他人的建议,将其转储到数据库中。初始加载到数据库可能不会比读取到 csv 快,但是当您真正开始需要处理数据时它会快得多,因为您可以创建索引来加速进一步的访问和操作。
标签: python pandas algorithm large-data data-processing