【问题标题】:Load static Django database into memory将静态 Django 数据库加载到内存中
【发布时间】:2013-10-19 01:23:51
【问题描述】:

我正在处理我的 Django 应用程序需要定期检索的一组较大的数据(约 30000 条记录)。这些数据并不会经常更改(可能一个月左右一次),并且所做的更改是分批完成的,因此我试图达到的数据库解决方案几乎是只读的。

这个数据集的总大小约为 20mb,我的第一个想法是我可以将它加载到内存中(可能作为对象上的单例)并以这种方式非常快速地访问它,尽管我想知道是否有通过避免磁盘 I/O 来减少获取时间的其他更有效的方法。 memcached 会是这里最好的解决方案吗?或者将它加载到内存中的 SQLite DB 会更好吗?还是在应用启动时将其作为内存变量加载?

【问题讨论】:

    标签: python django sqlite orm memcached


    【解决方案1】:

    我认为最简单的解决方案是将所有对象加载到内存中

    cached_records = Record.objects.all()
    list(cached_records) # by using list() we force Django load all data into memory
    

    那么你可以在你的应用中随意使用这个cached_records,也可以使用filter等QuerySet方法,但是缓存记录上的filter会触发DB查询。

    如果要根据条件查询这些记录,使用缓存是个好主意。

    【讨论】:

    • 我在使用此方法时遇到的问题是 list() 函数在导入模块时进行评估。这使得所有测试都失败,因为测试数据库还不存在,所以查询崩溃,一切都不好。我也有同样的问题,但是这个解决方案不够……
    【解决方案2】:

    磁盘IO真的会成为你应用性能的瓶颈,影响你的用户体验吗?如果不是,我认为这种优化是没有必要的。

    如今,操作系统和 RDBMS(例如 MySQL、PostgresQL)非常智能。磁盘中的数据会被RDBMS和OS自动缓存到内存中。

    【讨论】:

    • 我不确定这会造成多大的瓶颈,但由于它只有 20mb 的数据,我认为最好将其加载到内存中以便快速访问。我将研究使用 DB 的默认缓存策略,尽管我可能会使用我可以控制更多的缓存层,例如 memcached。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多