保持网页应用几乎静态数据的最佳方法是什么?

4 投票
6 回答
2736 浏览
提问于 2025-04-16 09:05

我正在用Python开发一个网页应用程序。这个应用的一部分是处理一些数据,这些数据可以这样描述:

Symbol     Begin Date      End Date
AAPL       Jan-1-1985      Dec-27-2010
...

这些数据有点静态——它会定期更新,也就是说:可能会添加新的条目,并且所有条目的“结束日期”字段可以更新。

现在,我的问题是:考虑到数据集的这种相对静态的特性,存储和处理这些数据的最佳方法是什么?“处理”意味着要随机获取一些行,希望每秒能获取几次。

我可以用XML文件、SQL数据库或SQLite、JSON对象文件,以及某种Python对象在内存中来实现。

不同解决方案的优缺点是什么?如果能解释一下边缘情况(比如“在每秒10次以内,XML文件是最好的选择,超过这个就用SQL数据库”),我会非常感激。

更新:感谢大家的回答!再补充一点小更新:目前数据集大约有3000行。预计一年后可能会增长到15000行。访问模式是:每天定期更新整个数据集;所以添加行和更新结束日期会同时进行。随机获取一行确实是按符号来获取,可以每秒进行几次。

6 个回答

0

因为你的数据结构非常清晰,所以用XML格式没什么用。CSV和JSON格式在你的需求下编辑起来比较快也比较简单。不过,如果你很看重数据的一致性(也就是说,数据在被读取的时候不能出错,因为可能正在被更新),那你就需要用文件锁定来确保这一点。除非你只需要一部分数据,而且你的应用程序不会在多台机器上同时运行,否则我觉得没有必要使用数据库。

1

我对这个问题的看法:

SQL:它可以扩展,很多工作都为你处理好了。如果你理解SQL,那它可能是(98%)最好的选择。

CSV文件:一旦你每秒需要处理超过几次(大约12次)的访问,这些文件在硬盘上就会变得很麻烦。不过,如果数据量适中,可以考虑使用内存驱动器(ramdrive),你可以把数据分成多个文件,并以非常快的速度访问它们。很多小文件也没问题。但你需要确保任何需要保存的数据都保存到真正的磁盘存储或SSD上。如果在SSD上使用CSV文件,数据量小的话,你可能能达到每秒1000次的访问速度。只要文件命名得当,数据集足够小,这也是一个可行的选择。

这里有很多“如果”,但是快速的访问速度是为了换取极高的可扩展性,以及让你不用担心数据的一致性。

3

每当数据发生变化时,我会生成一个新的Python源文件,这个文件主要是一个字典。这里假设我们是通过符号来查找数据,并且这些数据能够轻松地放进内存里。

data = {
  "AAPL":       ("Jan-1-1985",      "Dec-27-2010"),
...
}

要批量更新结束日期,可以使用pprint.pprint,直接覆盖整个文件。

编辑:为了说明如何写这样的文件,这里有一个脚本,它会用随机数据填充这个文件。

import random, string, pprint

def randsym():
    res =[]
    for i in range(4):
        res.append(random.choice(string.uppercase))
    return ''.join(res)

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
          'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
days = range(1,29)
years = range(1980,2010)
def randdate():
    return "%s-%s-%s" % (random.choice(months),
                         random.choice(days),
                         random.choice(years))

data = {}
for i in range(15000):
    data[randsym()] = (randdate(), "Dec-27-2010")

with open("data.py", "w") as f:
    f.write("data=")
    f.write(pprint.pformat(data))

要访问这些数据,可以使用 from data import data

撰写回答