use*_*857 5 python memory sorting
我有一个非常大的元组列表,我想按两个元素排序.例如:
List = [('chr1', 34234, 'extrainfo'), ('chr1', 1234, 'extrainfo'), ('chr3', 4234, 'extrainfo'), ('chr1', 3241, 'extrainfo')]
Run Code Online (Sandbox Code Playgroud)
这是一个非常大的列表,我想使用以下方式排序:
List = sorted(List, key=lambda i: (i[0], int[1])))
Run Code Online (Sandbox Code Playgroud)
这在使用较小的列表(例如上面的示例)时效果很好.但是,当我使用更大的数据集运行代码时,我会收到内存错误:
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
Run Code Online (Sandbox Code Playgroud)
您可以尝试的一些事情,大致按照难度/可取性的顺序.
不要使用创建列表的排序副本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.
实现自己的排序.