对于模拟系统,哪种数据结构最合适?

时间:2013-03-06 00:33:19

标签: python python-2.7 simulation database-performance

我正处于构建模拟的计划阶段,需要基于内存和速度考虑因素来表示数据的方法。

在每个时间步,模拟过程创建10 ^ 3到10 ^ 4个新数据记录,并查看每个新记录或现有记录(其中有10 ^ 6到10 ^ 8)然后删除它或修改它。

每条记录有3-10个简单字段,每个字段都是整数或多个ASCII字符的字符串。此外,每个记录还有1-5个其他字段,每个字段都包含一个包含整数的可变长度列表。典型记录的重量为100-500字节。

修改或删除过程的工作方式如下:对于此记录,计算一个函数,其参数是此记录的某些字段的值,以及另一个记录的这些字段的值。根据结果​​,该过程准备以某种方式删除或修改其字段。

然后重复每个其他记录。然后移动到下一个记录并重复。处理完所有记录后,模拟就可以进入下一个时间步。

在转到下一个时间步之前,应用所有准备好的删除和修改。

允许的记录越多,模拟效果越好。如果所有记录都在RAM中,则下行是模拟大小,并且可能上行是速度。模拟不需要是实时的,但显然我不希望它太慢。

为了表示内存中的每条记录,我知道这些选项:列表或dict(嵌套在其中的一些列表)或类实例。为了存储所有记录并在另一天继续模拟,对我的熟悉程度降低的顺序是:csv文件,其中每行是记录,或者只是将所有记录放入RAM然后将它们放入文件中(可能使用pickle),或使用某种数据库。

我已经学习了Python基础知识以及一些像生成器这样的概念,但没有学过数据库,没有尝试过酸洗,显然需要了解更多。如果可能的话,我会避免使用多台计算机,因为我只有1和并发,因为它看起来太可怕了。

关于如何在内存中表示记录以及如何存储模拟系统,您有什么建议?

1 个答案:

答案 0 :(得分:1)

如果我们采取最糟糕的情况,10 ** 8条记录和每条记录500字节,这将是很多RAM,所以值得设计一些灵活性并假设并非所有记录都将驻留在RAM中。你可以创建一个隐藏记录所在位置细节的抽象类。

class Record(object):
    def __init__(self, x, y, z):
        pass # code goes here
    def get_record(id):
        pass # code goes here

您可以使用名称get_record()而不是使用名称__index__(),然后您的类将像列表一样运行,但可能会出现在数据库中,或者引用RAM缓存,或者其他任何内容。只需使用整数作为ID值。然后,如果你改变主意关于持久性存储(从数据库切换到pickle或其他),实际的代码将不会改变。

你也可以尝试制作一个非常庞大的交换文件,并让虚拟内存系统处理进出实际RAM的记录。这很容易尝试。它没有任何简单的方法来中断计算并保存状态。

您可以将每个记录表示为元组,甚至是命名元组。我相信一个元组会有任何"容器的最低开销#34; Python中的对象。 (一个命名的元组只将名称存储在一个地方,所以它的开销也很低。)