3

我正在尝试处理具有 ~730 亿行的 CSV 文件,
我将处理后的行存储到 python collections.defaultdict 中,将字符串作为键和元组作为值,但是将此数据结构存储到字典中需要 ~100 秒存储 50K 行。

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

稍后我将这些处理过的 CSV 文件加载到表中并进行完全外部连接以获得组合结果。

CSV ID 的示例 ROW,值:

"10203","http://google.com/goo.gl?key='universe'&value='somedata'"

数据结构:

dt = {'goog': [(10203, 1), ...}

基本上,我正在尝试实现一种用于全文搜索功能的算法——为此,我需要在 4 个字符的部分及其关联的 ID 中保持值的位置。

4

2 回答 2

5

以下是一些想到的事情-

  1. 正如@Burhad 建议的那样,为什么不能将此文件直接加载到数据库中?任何类型的字符串处理都可以在 MySQL 等常规 RDBMS 中完成。他们有你知道的字符串功能。一个简单的 DB 例程可以在 DB 本身内完成这一切,甚至无需首先将数据写入文件。
  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 文件中的每一行都可以独立处理,并且行之间没有依赖关系。

于 2013-06-09T06:18:40.243 回答
0

最后我找到了最适合我当前需求的完美解决方案。

以前此任务运行大约 20-24 小时,现在大约需要半小时。

我正在寻找的编程模型是 Map Reduce 编程模型。对于我的要求,它易于使用且易于编码。

它的编写速度确实更快且效率更高:我将 gpmapreduce 实用程序与 Python 编程语言一起使用。

感谢:@Srikar-Appal 与他的第 4 个解决方案类似 - 基于此,我启发了使用 mapreduce 模型。

于 2013-06-30T10:06:40.883 回答