【发布时间】:2017-11-09 10:27:13
【问题描述】:
我目前正在处理一些非常大的信息列表(50 到 1 亿个条目),其中列表中的每个项目都采用 [float,(string_1,string_2)] 的形式
我以未排序的方式将元素添加到列表中,并且最终希望有一个按浮点值排序的列表。例如,我会有一个如下所示的列表:
[ [0.5,(A,B)], [-0.15,(B,C)], [0.3,(A,C)], [-0.8,(A,D)] ]
然后排序得到
[ [0.5,(A,B)], [0.3,(A,C)], [-0.15,(B,C)], [-0.8,(A,D)] ]
目前我正在使用 heapq 添加项目,然后使用 sorted(heap) 最终给我我需要的列表。我的问题是:有没有更好的方法可以将数百万个项目添加到列表中并对它们进行排序而不会导致我的计算机崩溃?持有这么长的列表然后对其进行排序会导致我的 RAM 出现一些问题。
【问题讨论】:
-
有这么多条目,您应该真的考虑在收集数据时将其写入文件。
-
为什么不使用
generators?与其将数据存储到列表中然后对其进行排序,不如创建一个生成器然后对其进行一次排序。 -
@ChihebNexus:生成器仍将转换为内存中的
list以对其进行排序。 -
@ShadowRanger 是的,但是您将避免将整个列表存储在内存中然后再次对其进行排序。
-
@ChihebNexus:你不会的。如果您只是在前面设置
list(没有毫无意义地使用heapq),那么调用.sort()是完全一样的。如果您调用sorted(mygenerator)与sorted(mylist)相比,它可以节省,但如果您已经拥有mylist,调用mylist.sort()也可以避免内存开销。