python - 对于仿真系统,哪种数据结构最合适?

标签 python python-2.7 simulation database-performance

我正处于构建模拟的规划阶段,需要关于如何基于内存和速度考虑来表示数据的想法。

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

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

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

然后对彼此重复记录。然后移动到下一条记录并重复。处理完所有记录后,模拟就可以进入下一个时间步长了。

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

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

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

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

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

最佳答案

如果我们采用最坏的情况,即 10**8 条记录和每条记录 500 字节,那将是大量 RAM,因此值得设计一些灵 active 并假设并非所有记录都始终驻留在 RAM 中。您可以创建一个抽象类来隐藏记录所在位置的详细信息。

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

您可以使用名称 __index__() 而不是使用名称 get_record() 然后您的类将像列表一样工作,但可能会去到一个数据库,或引用 RAM 缓存,或其他任何内容。只需使用整数作为 ID 值。然后,如果您改变了对持久性存储的想法(从数据库切换到 pickle 或其他),实际代码将不会改变。

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

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

关于python - 对于仿真系统,哪种数据结构最合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15236840/

相关文章:

python - tensorflow 的 tables_initializer 有什么作用?

python - Django 与 Apache : Global variable in view. py

python - 在 Python 中将高占用区域绘制为密度图或等高线

python - 获取Python中字典字典中所有键的数量

c# - 线程——执行时间的模拟

python - 如何在程序中启动 python 控制台(以便于调试)?

python - 从列表中删除重复元素

javascript - 如何从 NodeJs 调用 python 脚本

java - 模拟问题Java

C++ 模拟脉冲串序列