如何将巨大的CSV文件处理成python?

sha*_*pan 3 python csv optimization data-structures

我正在尝试处理一个大约有73亿行的CSV文件,
我将已处理的行存储到python collections.defaultdict中,其中字符串为键,元组为值,但是将此数据结构存储到字典中需要大约100秒存储50K行.

我正在以50K行的块处理CSV文件,以确保系统不会耗尽内存或避免磁盘溢出I/O交换操作.

稍后我将这些处理过的CSV文件加载到表中并进行FULL OUTER JOIN以获得组合结果.

CSV ID的示例ROW,值:

"10203","http://google.com/goo.gl?key='universe'&value='somedata'"
Run Code Online (Sandbox Code Playgroud)

数据结构:

dt = {'goog': [(10203, 1), ...}
Run Code Online (Sandbox Code Playgroud)

基本上我正在尝试实现全文搜索功能的算法 - 为此我需要保持4个字符的部分值及其关联ID的位置.

Sri*_*aju 5

以下是一些想到的事情 -

  1. 正如@Burhad所说,为什么你不能直接将这个文件加载到DB中?像你一样的任何类型的字符串处理都可以在像MySQL这样的常规RDBMS中完成.他们有你知道的字符串功能.一个简单的数据库例程可以在数据库本身内完成所有这一切,甚至不需要将数据写入文件.
  2. 如果你不想采取上述方法.我建议你试试这个.将文件拆分为可让我们说n较小的文件.启动一个主进程,该进程分叉n子进程并行处理这n个块文件.那样在100秒内您理论上会n * 50,000处理行.请注意,我在说"理论上",因为如果所有这些都发生在单个硬盘上,则硬盘可能无法同时传输数据.因此,在满足并发请求时可能存在延迟(但是,在现代操作系统上运行的I/O算法再次缓存正在读取的文件的一部分,这可能使您接近上述数字).
  3. 上述方法的扩展是使用多个硬盘,它们都是同一本地机器上同一raid级别的一部分.
  4. 如果你需要更多的吞吐量思考分布式计算.喜欢说x machines每个人y harddisks.制作x*y chunks文件并将它们放入这些机器中.并运行您的处理程序.所以你x*y*50000 rows在相同的100秒内处理.吞吐量随着所使用的机器和硬盘的数量而增加.您可能不得不处理分布式计算的一些新问题(如可用性,容错等),但仍然......

第2,3和4点的前提是假设CSV文件中的每一行都可以独立处理,并且行之间没有依赖关系.