【发布时间】: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。
-
我问了一个关于另一个场所的阵列的类似问题。带回家的是没有这样的东西,你可以把所有的东西都写到一个文件中,如果它足够小的话,让操作系统缓存为你保存在内存中。使用大缓冲区帮助它。从数据流中读取应该不是问题,您读取它,将其保存在内存中,并在适当时将其刷新到磁盘。