代码之家  ›  专栏  ›  技术社区  ›  Red Spanner

如何使用Python-io模块构建驻留在内存中的数据结构?

  •  3
  • Red Spanner  · 技术社区  · 14 年前

    我试图将从数据采集系统收集的数据写入内存中的位置,然后异步地对数据执行进一步的处理,或者将其写入文件进行离线处理。我试图以这种方式实现这种架构,将数据采集与数据分析和传输隔离开来,为我们未来的扩展和改进提供了一些灵活性,但这肯定比简单地将数据直接写入文件更复杂。

    以下是我写的一些探索性代码。

    #io.BufferedRWPair test
    from io import BufferedRWPair
    
    # Samples of instrumentation data to be stored in RAM
    test0 = {'Wed Aug  1 16:48:51 2012': ['20.0000', '0.0000', '13.5', '75.62', '8190',
                        '1640', '240', '-13', '79.40']}
    test1 = {'Wed Aug  1 17:06:48 2012': ['20.0000', '0.0000', '13.5', '75.62', '8190',
                 '1640', '240', '-13', '79.40']}
    
    # Attempt to create a RAM-resident object into which to read the data.
    data = BufferedRWPair(' ', ' ', buffer_size=1024)
    
    data.write(test0)
    data.write(test1)
    
    print data.getvalue()
    
    data.close()
    

    这里有几个问题(也许更多!):

    ->'“data”是一个变量名,它选择了我试图组装的一个结构(Python之外)——这是一个类似数组的结构,应该保存顺序记录,每个记录都包含几个过程数据测量值,前面有一个时间戳,可以作为检索的键。我将此作为我设计意图的背景,以防代码过于模糊,无法反映我的真实问题。

    ->此代码不起作用,因为没有创建“data”对象。我只是想打开一个空的缓冲区,稍后再填充,但Python正在寻找两个对象,一个可读,一个可写,它们不在我的代码中。正因为如此,我甚至不确定我是否使用了正确的结构,这导致了以下问题:

    1. io.BufferdRWPair是处理这些数据的最佳方式吗?我试过StringIO,因为我使用的是Python 2.7.2,但没有成功。我喜欢带时间戳键的记录的想法,因此我选择了dict结构,但我肯定会考虑其他选择。还有其他io类我应该看看吗?

    2. 我看到的一个替代方案是在NumPy/SciPy/Pandas世界中定义的DataFrame构造。它看起来很有趣,但似乎需要很多额外的模块,所以我对此避而不谈。我对这些模块都没有经验——我应该看看这些更复杂的模块来获得我需要的东西吗?

    我欢迎任何建议或反馈,各位。。。谢谢你检查这个问题!

    2 回复  |  直到 14 年前
        1
  •  3
  •   Bryan Oakley    14 年前

    如果我理解您的要求,那么使用内存中的sqlite数据库可能是可行的。Sqlite允许您在内存中创建一个功能齐全的SQL数据库。与其读写,不如选择和插入。

        2
  •  0
  •   Sven Marnach    14 年前

    编写一种机制,在合适的时候将数据保存在内存中,并仅在必要时将其写入文件,这是多余的——无论如何,操作系统都会为您做到这一点。如果使用普通文件并从应用程序的不同部分访问它,只要有足够的内存,操作系统就会将文件内容保留在磁盘缓存中。

    如果您想通过内存地址访问文件,可以使用 mmap 单元然而,我的印象是,您所需要的只是一个标准数据库,或者Python标准库提供的一个更简单的替代方案,例如 shelve 任何 anydbm 模块。

    根据您的评论,还可以查看以下关键价值存储 Redis 和 memcached 。

    推荐文章