【问题标题】:Python list-like object buffered to file?缓冲到文件的类似 Python 列表的对象?
【发布时间】:2014-07-25 05:21:50
【问题描述】:

在我重新发明轮子之前,Python 中是否存在一个模块,它提供了一个类似于列表的简单类,可以根据需要将自身缓冲到文件中?

特别是,我想做这样的事情:

b = BufferedList(limit = 10000, tmp = '/tmp')
b.append(some_tuple)
b.append(some_tuple)
b.append(some_tuple)
# ad nauseam 

这将创建一个名为 b 的缓冲列表。如果 b 的内存消耗超过 10000K 字节,则进一步追加将写入临时文件。

我真正需要的只是简单的迭代。 pop、del、sort 等功能会很好,但不是强制性的。该列表将主要包含字符串元组。

我使用的是 2.7。

这将在 Windows Server 2003 上实现。

编辑:正如 Davidmh 在 cmets 中间接指出的那样,我真的是在倒退为了我的需要

因为我真的不需要 pop、del、sort 和其他列表操作方法,所以今天最干净的解决方案就是在调用 open() 时为缓冲区设置一个适当大的值,如果我认为总是写入文件可能需要它。

我将在我的 SQL 任务中添加一个标志。它可能最终会是这样的:

imp = SqlImportTask()
imp.src_cs = std_config.DB04_CS
imp.dst_cs = std_config.SQL07_CS
imp.sql = 'SELECT * FROM PurchaseOrderDetail'
imp.dst_table = 'dbo.PurchaseOrderDetail'
imp.use_tmp_file = True

【问题讨论】:

  • 您希望从中获得什么?如果您的进程消耗太多内存,请让操作系统处理分页。
  • 内存消耗在 Python 中有点难以定义,也很难实现。您是否仅指列表中对象引用的大小?它的内在能力?列表引用的所有对象的大小(递归与否?或混合?)?那东西呢?如果一个对象被多次引用怎么办?如果一个物体的“大小”在你脚下发生变化,列表应该怎么做?它怎么会注意到这一点?
  • RedX,我将从 ODBC 连接中读取大小未知的字符串元组,然后将它们写入另一个 ODBC 连接。数据可能只有 10KB,但很容易达到 1GB。读取必须尽快完成,所以我不能读/写,读/写。这将在 Windows Server 2003 上。
  • @Xevious 你能以某种方式管道它而不是一次读取整个列表吗?创建一个处理一次获取 X 行并产生数据的对象。从该生成器读取并插入到您的其他连接中,也可能分批插入,以便您可以使用 Batch SQL。
  • 我问了一个关于另一个场所的阵列的类似问题。带回家的是没有这样的东西,你可以把所有的东西都写到一个文件中,如果它足够小的话,让操作系统缓存为你保存在内存中。使用大缓冲区帮助它。从数据流中读取应该不是问题,您读取它,将其保存在内存中,并在适当时将其刷新到磁盘。

标签: python list


【解决方案1】:

在 Python 中有一个名为 Pickle 的对象序列化库

【讨论】:

  • 泡菜车将对象保存到文件中,但不能自动管理内存。
  • 我经常用泡菜。在这种情况下,序列化不是问题 - 相反,我正在寻找一些分页功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多