【发布时间】:2013-09-17 05:23:52
【问题描述】:
我正在寻找一种以随机方式访问 csv 文件单元格的方法。如果我使用 Python 的 csv 模块,我只能遍历所有相当慢的行。我还应该补充一点,该文件非常大(>100MB),而且我正在考虑缩短响应时间。
我可以将文件预处理为不同的数据格式,以便更快地访问行/列。也许有人以前做过,可以分享一些经验。
背景:
我想在 Web 服务器提供的屏幕上显示 csv 的摘录(取决于滚动位置)。不能将文件保存在内存中。
【问题讨论】:
-
如果你不想遍历一个文件(不管是哪种格式),也许文件不是你持久化的首选。如果访问时间是一个问题,您是否考虑过使用数据库?
-
你可以看看内存映射文件docs.python.org/2/library/mmap.html
-
您可以遍历文件并保留单元格位置的数组,例如指向单元格的指针。然后可以使用这些来寻找特定位置。这个offcourse仍然取决于IO速度。请参阅我上面的评论,以使用大内存缓冲区来增加它。
-
我会尝试 Joram 关于指针的回答。如果一次处理整行,则只能跟踪指向行的指针。如果它符合您的需求,您甚至可以在一些关键变量上建立索引。我已经这样做了,对大型(20 GB)文件进行统计,这样可以节省时间,但就我而言,有趣的单位是整行。
-
你想对文件做什么?只有阅读吗?然后将从 csv 模块获得的行保存在列表中应该非常有效。如果您需要不断更新 CSV 文件并快速执行此操作,那么 SQLite 方法更适合。