Python 大列表排序与存储

2024-03-10

我目前正在处理一些非常大的信息列表(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 来添加项目,然后使用排序(堆)最终给出我需要的列表。我的问题是:是否有更好的方法可以将数百万个项目添加到列表中并对它们进行排序,并且不会使我的计算机崩溃?持有这么长的列表然后对其进行排序会导致我的 RAM 出现一些问题。


sorted()创建一个完全不同的列表,因此将庞大列表所需的 RAM 加倍。使用列表的.sort()方法 - 就地对列表进行排序。

除非有什么你没有告诉我们的事情,否则就离开heapq完全摆脱它。我认为将条目放入堆中没有任何意义。只需使用列表的.append()方法添加新条目并应用.sort(reverse=True)到最后的列表。

如果您仍然耗尽 RAM,那么您根本无法完全在内存中解决此问题,并且需要设计一种合并磁盘文件的方法。

与“太小”的内存一起生活

在最坏的情况下,即使列表本身也无法容纳在可用内存中。您仍然可以创建排序序列,但需要将排序块写入磁盘并稍后合并它们。对于合并部分,heapq is有用。这是一个例子:

import pickle
import heapq

MAXPERFILE = 100  # the array will never get bigger than this

def getfname(i):
    return "pickled%d.dat" % i

filenum = 0
def dumptofile(a):  # dump the array to file, as pickled data
    global filenum
    fname = getfname(filenum)
    with open(fname, "wb") as f:
        pickle.dump(len(a), f)
        for x in a:
            pickle.dump(x, f)
    filenum += 1

# generate some random data
import random
a = []
for _ in range(1012):  # 10 "full" files with some leftovers
    a.append(random.random())
    if len(a) == MAXPERFILE:
        a.sort(reverse=True)
        dumptofile(a)
        del a[:]
if a:
    a.sort(reverse=True)
    dumptofile(a)

print("number of files written:", filenum)

# now merge the files together; first a function
# to generate the file contents, one at a time
def feedfile(i):
    fname = getfname(i)
    with open(fname, "rb") as f:
        count = pickle.load(f)
        for _ in range(count):
            yield pickle.load(f)

for x in heapq.merge(*(feedfile(i) for i in range(filenum)),
                     reverse=True):
    print(x)

最大内存使用量可以通过减少来减小MAXPERFILE,虽然越大性能越好MAXPERFILE。确实,如果MAXPERFILE足够小并且数据总量足够大,合并代码可能会因操作系统“打开文件太多”错误而终止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 大列表排序与存储 的相关文章

随机推荐

  • 使用 AAD 在 Application Insights REST API 上进行身份验证

    到目前为止 我成功使用 Application Insights REST API 来获取带有 X Api Key 标头的指标 然而 通过我们的新仪表板 抓取多个指标 我们严重达到了 1500 个请求 API 密钥的限制 有些人建议尝试使用
  • Jenkins 中的 WorkflowScript.with

    我在 jenkins 共享库中有一个类 它存储来自 jenkins 管道脚本的 WorkflowScript 类的实例 如下所示 def myTools new my org MyTools this MyTools 的构造函数只是存储 W
  • 如何在 Spring MVC 中将集合属性绑定到表单

    我正在尝试使用 Spring MVC 将我的模型对象之一绑定到表单的字段 一切工作正常 除了模型对象的属性之一是无序集合 做类似的事情
  • 字段中的空值会生成 MatchError

    下面的内容很有趣 val rddSTG sc parallelize List RTD ANT SOYA BEANS 20161123 20161123 4000 docid11 null 5 RTD ANT SOYA BEANS 2016
  • 如何使用.NET反射来确定方法返回类型(包括void)和参数?

    如何知道参数的个数和类型 如何知道返回类型 如何检查返回类型是否为void Use MethodInfo ReturnType http msdn microsoft com en us library system reflection
  • 在 Keras 损失函数中重塑 TensorFlow 张量?

    有没有办法在自定义 Keras 损失函数内重塑 TF 张量 我正在为卷积神经网络定义这个自定义损失函数 def custom loss x x hat Custom loss function for training background
  • Android Parcelable 数组问题

    大家好 我已经构建了一个实现 Parcelable 的类 但是当我读取该类时 我定义的 arraylist 属性之一变为空 这是代码 package roblestech laCartelera import java util Array
  • 如何用C++读取系统信息?

    我正在尝试使用 C 获取 Linux 系统上的操作系统版本 硬盘空间 可用磁盘空间以及已安装 RAM 等信息 我知道我可以使用system 运行不同的 Linux 命令并捕获它们的输出 这就是我目前正在做的 但我想知道是否有更好的方法 C
  • 如何使用 d3 生成 svg 客户端而不将其附加到 DOM(与 React.js 一起使用)

    我正在使用 React js 构建一个应用程序 其中包含相当多的 svg 图表 我使用 d3 函数来帮助创建图表 例如比例尺 然后使用 React 生成 svg 元素 这是关于该方法的精彩文章 http 10consulting com 2
  • 如何将变量传递给 re.sub 回调?

    我正在使用 re sub 回调将子字符串替换为随机值 但我希望不同字符串中的随机值相同 由于 re sub 回调不允许参数 我不知道如何做到这一点 这是我正在做的事情的简化版本 def evaluate match mappings A 1
  • 条件语句如何与按位运算符一起使用?

    我试图理解 if 条件如何与按位运算符一起使用 检查数字是偶数还是奇数的方法可以通过以下方式完成 include
  • JavaScript 伪协议实际上是做什么的? [复制]

    这个问题在这里已经有答案了 换句话说 两者之间有什么区别 onclick myFunction and onclick JavaScript myFunction The JavaScript 事件处理程序中的 TYPE LABEL PRE
  • 避免目录中一次发生太多更改的错误

    如何避免C 中FileSystemWatcher的错误 目录中一次更改太多 我必须检测网络共享上的所有更改 InternalBufferSize 增加到 8192 128 您应该做两件事 Set InternalBufferSize到支持的
  • Python 使用 curve_fit 拟合对数函数

    我正在尝试使用拟合对数曲线curve fit 假设如下Y a ln X b 但拟合的数据看起来仍然不正确 现在我正在使用以下代码 from scipy optimize import curve fit X 3 0 3 1 3 2 3 3
  • Python(pandas):使用多索引将数据帧存储在hdf5中

    我需要使用具有多索引的大尺寸数据框 因此我尝试创建一个数据框来学习如何将其存储在 hdf5 文件中 数据框是这样的 前2列有多重索引 Symbol Date 0 C 2014 07 21 4792 B 2014 07 21 4492 A 2
  • 由 PKCS#7 加密消息保护的 API

    我当前正在尝试调用一个 API 该 API 要求我将 XML 数据放入 PKCS 7 格式 该数据被发布到 API 端点 响应还采用 PKCS 7 加密消息的形式 MIME 类型为 application pkcs7 mime 他们提供的一
  • 列出目录中的图像(01.png)和描述(01.txt)

    如何显示目录中的图像并获取每个图像的相应描述 假设描述存在 在目录中 01 png 01 txt 02 png 03 png 03 txt etc 显示为 img src 01 png br This is the description
  • 如何在 android 中创建自定义开关,并在开关轨道两侧和拇指上显示文本?

    如何在 android 中设计自定义开关 如下图所示 当它打开时 它需要看起来像这样 我还需要在两个类别之间切换时显示切换动画效果 我怎样才能实现它 是否有可用的第三方 SDK 或库 目前我已经用自定义线性布局设计它 如下所示 my lay
  • 列表理解与元组分配

    我想问一下python中是否可以实现这样的事情 a b i i 1 for i in range 5 我知道这是不可能的 因为我有一个错误 但我认为你明白我想要实现的目标 让我澄清一下 我可以这样做 a b 3 2 3 编辑 gt 或者甚至
  • Python 大列表排序与存储

    我目前正在处理一些非常大的信息列表 50 到 1 亿个条目 其中列表中的每个项目都采用 float string 1 string 2 的形式 我以未排序的方式将元素添加到列表中 并且最终希望有一个按浮点值排序的列表 例如 我会有一个如下所