Python:由两个元素组成的内存高效的元组列表

时间:2014-04-30 21:08:49

标签: python sorting memory

我有一个非常大的元组列表,我想按两个元素排序。例如:

List = [('chr1', 34234, 'extrainfo'), ('chr1', 1234, 'extrainfo'), ('chr3', 4234, 'extrainfo'), ('chr1', 3241, 'extrainfo')]

这是一个非常大的列表,我想使用:

进行排序
List = sorted(List, key=lambda i: (i[0], int[1])))

使用较小的列表(如上例)时效果很好。但是,当我使用更大的数据集运行代码时,会出现内存错误:

Python(32306) malloc: *** mmap(size=34684928) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
  File "MyCode.py", line 139, in <module>
    List = sorted(List, key=lambda i: (i[0], int(i[1])))
MemoryError

3 个答案:

答案 0 :(得分:6)

你可以尝试一些事情,大致按照难度/可取性的顺序。

  • 请勿使用sorted()创建列表的已排序副本。而是使用List.sort()对列表进行排序。

  • 对列表进行两次排序,首先是key=lambda i: i[1],然后是key=lambda i: i[0]。这将花费更长时间,但是每个通道上的键列表将需要更少的空间。 Python的排序在v2.2及更高版本中保证稳定。按照它们重要性的相反顺序对键进行排序是我们以前只能按一个键进行排序的方式。

  • 根本不要使用按键功能。按顺序按元组中的项排序是默认行为!你不关心第三个和后续项目的顺序,那么为什么不让Python继续进行排序呢?他们也会按顺序排列,但这和任何订单一样好。 (如果其他元素是不支持比较的类型,则无效。)

  • 如果您的Python版本足够支持它,请使用cmp函数而不是key函数。这将避免生成密钥列表,但速度较慢,在Python 3中不起作用。

  • 在具有足够内存的计算机上,在64位操作系统上使用64位版本的Python。

  • 实施您自己的排序。

答案 1 :(得分:0)

使用结构化数组可能会更幸运,因为它们比大数据集的列表更快

http://docs.scipy.org/doc/numpy/user/basics.rec.html

http://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html

答案 2 :(得分:0)

您有两种选择: 1.增加RAM的大小。 2.尝试一次处理少量数据,特别是如果您正在对语料库或文本进行操作,就像它看起来一样。

你似乎有类似的钥匙。因此,请尝试使用从集合中导入的要素计数器。如果额外的信息不同,那么您可以使用嵌套。

这将为您省去很多麻烦。