我正处于构建模拟的规划阶段,需要基于内存和速度考虑如何表示数据的想法。
在每个时间步,模拟过程创建10^3到10^4个新的数据记录,并查看每个新的或现有的记录(有10^6到10^8个),然后删除或修改它。
每条记录都有3-10个简单字段,每个字段可以是一个整数,也可以是几个ASCII字符的字符串。此外,每条记录都有1-5个其他字段,每个字段都有一个包含整数的可变长度列表。典型的记录重100-500字节。
修改或删除过程的工作原理如下:对于此记录,计算一个函数,其参数是此记录的某些字段的值,以及另一条记录的这些字段的值。根据结果,流程准备以某种方式删除或修改其字段。
然后对每个其他记录重复此操作。然后移动到下一条记录并重复。当所有记录都处理完毕后,模拟就可以移动到下一个时间步了。
在移动到下一个时间步骤之前,应用准备好的所有删除和修改。
允许的记录越多,模拟效果就越好。如果所有记录都在RAM中,则缺点是模拟大小,而优点大概是速度。模拟不需要是实时的,但显然我不希望它太慢。
为了表示内存中的每条记录,我知道这些选项:一个列表或字典(其中嵌套了一些列表),或者一个类实例。为了保存所有记录并在另一天继续模拟,按我熟悉程度递减的顺序有: csv文件,其中每行都是一条记录,或者只是将所有记录放入RAM中,然后将它们放入一个文件中(可能使用pickle),或者使用某种数据库。
我已经学习了Python的基础知识以及生成器等一些概念,但是还没有学习数据库,也没有尝试过酸洗,显然还需要学习更多。如果可能的话,我会避免多台计算机,因为我只有一台,而并发,因为它看起来太可怕了。
关于如何在内存中表示记录,以及如何存储模拟系统,您有什么建议?
发布于 2013-03-06 09:20:33
如果我们以最坏的情况为例,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__(),然后您的类将表现得像一个列表,但可能是转到数据库,或者引用内存缓存,或者其他任何东西。只需使用整数作为ID值。然后,如果您改变了对持久性存储的看法(从数据库切换到pickle或其他),实际的代码将不会改变。
您还可以尝试创建一个非常大的交换文件,并让虚拟内存系统处理记录进出实际RAM的处理。这很容易尝试。它没有任何简单的方法来中断计算并保存状态。
您可以将每条记录表示为一个元组,甚至是一个命名元组。我相信在Python中,元组的开销是所有“容器”对象中最低的。(命名元组只在一个地方存储一次名称,因此开销也很低。)
https://stackoverflow.com/questions/15236840
复制相似问题