当前位置: 首页 > 面试题库 >

在内存中保留大列表的替代方法(python)

芮琛
2023-03-14
问题内容

如果我在python中有一个列表(或数组,字典…),它可能会超出可用的内存地址空间,(32位python)有哪些选项和相对速度?(除了不使列表变大之外)列表
可能
超出内存,但我无法事先知道。一旦开始超过75%,我将不再希望将该列表保留在内存中(或者无论如何都不会保留新项目),有没有办法在中途转换为基于文件的方法?

最佳(快进和快出)文件存储选项是什么?

只需要存储一个简单的数字列表。无需随机访问第N个元素,只需执行append / pop类型的操作即可。


问题答案:

如果您的“数字”是足够简单的数字(每个最大为4个字节的有符号或无符号整数,或者每个为4或8个字节的浮点数),我建议使用标准库数组模块作为保留数百万个的最佳方法在内存(“虚拟阵列”的“尖端”)中存储一个二进制文件(针对二进制R / W打开),以支持磁盘上其余结构。
array.array具有非常快fromfiletofile方式,方便数据的来回移动。

即,基本上,假设无符号长数,例如:

import os

# no more than 100 million items in memory at a time
MAXINMEM = int(1e8)

class bigarray(object):
  def __init__(self):
    self.f = open('afile.dat', 'w+')
    self.a = array.array('L')
  def append(self, n):
    self.a.append(n)
    if len(self.a) > MAXINMEM:
      self.a.tofile(self.f)
      del self.a[:]
  def pop(self):
    if not len(self.a):
      try: self.f.seek(-self.a.itemsize * MAXINMEM, os.SEEK_END)
      except IOError: return self.a.pop()  # ensure normal IndexError &c
      try: self.a.fromfile(self.f, MAXINMEM)
      except EOFError: pass
      self.f.seek(-self.a.itemsize * MAXINMEM, os.SEEK_END)
      self.f.truncate()
    return self.a.pop()

当然你也可以添加其他的方法在必要时(总长度如跟踪,添加extend,等等),但如果popappend确实是你所需要的这应有助于。



 类似资料:
  • 所以我有一个递归程序,我试图生成一个字符串的所有排列。我打算将排列存储在一个名为ans的列表中。 每个当前排列都存储在用于填充ans列表的容器列表中。我怀疑,因为列表是一种引用类型,所以我可能会因为容器列表被操纵而丢失ans列表中的值?我是白痴吗

  • 问题内容: 我只是尝试了内存中python数据结构的大小。我写了以下代码片段: 我在以下配置上测试了代码: Windows 7 64位,Python3.1:输出为:所以lst1有52个字节,lst2有40个字节。 使用Python3.2的Ubuntu 11.4 32bit:输出为 Ubuntu 11.4 32位Python2.7: 谁能向我解释为什么两个大小都不同,尽管它们都是包含1的列表? 在g

  • 我正在尝试将一个xml文件保存到Android的内部存储中。但是,该文件没有得到保留。每次我重新启动模拟器时,该文件都会是空的。只有当我在应用程序中手动选择向其写入内容时,该文件才会被写入内容。然后,如果我关闭应用程序或其他什么,文件内容会被保留。但是,当我关闭模拟器时,文件会在那里,但是空的。 因此,我不确定我是否正确地保存了它。 请看看我的代码,也许它有问题,或者它与我的Android模拟器的

  • 问题内容: 对于Java语言有些陌生,我试图使自己熟悉所有可能遍历列表(或其他集合)的方式(或至少是非病理性方式)以及每种方式的优缺点。 给定一个对象,我知道以下遍历所有元素的方式: 基本的for 循环(当然,也有等效的while/ do while循环) 注意:正如@a​​marseillan指出的那样,这种形式对于在s上进行迭代是一个糟糕的选择,因为该方法的实际实现可能不如使用时有效。例如,实

  • 由于对Java语言有些陌生,我正在尝试熟悉所有可以通过列表(或者其他集合)进行迭代的方法(或者至少是非病态的方法),以及每种方法的优缺点。 给定一个对象,我知道以下循环所有元素的方法: 注意:正如@Amarseillan所指出的,对于迭代s,此表单是一个糟糕的选择,因为方法的实际实现可能不如使用时那样高效。例如,实现必须遍历i之前的所有元素以获得第i个元素。 在上面的示例中,实现没有办法“保留它的

  • 问题内容: 我使用以下代码在C#中实例化PhantomJSDriver: 并用以下方法清理它: 进程应该退出还是留在内存中?如果应该保留在Windows 7任务管理器中可见的内存中,我可以通过编程方式将其杀死吗?我是不是该? 问题答案: 直接回答,不应该用于清理实例。为了进行适当的清理,我们必须使用。 :我认为已弃用。 :用于关闭当前页面或具有焦点的浏览器(如果它是唯一的页面/选项卡)。 :它用于