2013-03-06 99 views
3

我正处于构建仿真的规划阶段,需要关于如何根据内存和速度考虑来表示数据的想法。对于仿真系统,哪种数据结构最合适?

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

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

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

然后重复每个其他记录。然后移动到下一个记录并重复。当所有记录都被处理完毕后,仿真就可以转移到下一个时间步骤。

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

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

为了表示内存中的每条记录,我知道这些选项:列表或字典(其中嵌套一些列表)或类实例。为了将所有记录储存起来并在另一天继续进行模拟,我逐渐熟悉的选项是:一个csv文件,其中每行都是记录,或者只是将所有记录放入RAM中,然后将它们放入一个文件中(可能使用腌菜),或者使用某种数据库。

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

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

+0

先从最简单的方法开始,但是留下[只要]抽象以根据需要进行更改。无论如何,“关键值存储”或“持久哈希”存储可能值得研究。 – 2013-03-06 00:43:30

回答

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。这很容易尝试。它没有任何简单的方法来中断计算并保存状态。

您可以将每条记录表示为元组,即使是指定的元组。我相信一个元组在Python中的所有“容器”对象的开销最低。 (一个命名的元组只在一个地方存储了一次名称,所以它的开销也很低。)