Python:使用数组和字典创建大数据库

Python:使用数组和字典创建大数据库,python,database,dictionary,Python,Database,Dictionary,我正在尝试建立一个数据库,用于python中的物理信号分析,当获取更多数据时,可以更新该数据库 我没有数据库创建和处理方面的经验,因为我最近在与同事共享时从ROOT迁移到python for commodity。我曾经循环使用不同属性(粒子名称、能量、日期等)的根文件来执行我想要执行的分析。这些文件中的每个文件都包含几个称为事件的信号,这些信号允许进行统计分析。目前,这些文件总计为20GB,但将增加 我想将我的分析转换成python代码,但使用数据库,而不是保留拆分文件。我应该能够选择某些属性并

我正在尝试建立一个数据库,用于python中的物理信号分析,当获取更多数据时,可以更新该数据库

我没有数据库创建和处理方面的经验,因为我最近在与同事共享时从ROOT迁移到python for commodity。我曾经循环使用不同属性(粒子名称、能量、日期等)的根文件来执行我想要执行的分析。这些文件中的每个文件都包含几个称为事件的信号,这些信号允许进行统计分析。目前,这些文件总计为20GB,但将增加

我想将我的分析转换成python代码,但使用数据库,而不是保留拆分文件。我应该能够选择某些属性并检索相关信号以执行一些分析。该数据库也应该能够在未来进行更新

我学习了pickle、panda和sqlalchemy,它们是我想做的事情的伟大工具,我尝试从创建数据库开始实施不同的解决方案。(下一阶段是从数据框中搜索和检索数据)

目前,我尝试了不同的结构来组织数据:

_嵌套字典:

dataDict["particle_name"]["energy_value"][...]["event_ID"]=signal (type= np.array)
_结构化阵列:

simtype = [("particle_name", 'U13'),("energy_value", 'f8'),...,("event_ID",'i8'),('signal', 'f8', amplisize)]
x=np.array((proton,13.8,...,156,signal),dtype=simtype)
然后写入一个文件,我尝试转储到pickle文件和json文件。我必须为json使用以下编码器

from json import JSONEncoder
import json
class NumpyArrayEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        return JSONEncoder.default(self, obj)
我不知道为什么json文件比我原来分散的文件重3倍。因此,我将重点放在pickle文件上,它似乎更容易工作。我应该为我的案例重新考虑json文件吗

我的问题是更新过程。我首先考虑装载泡菜数据,然后更新它。 使用时,对于字典大小写:

class NestedDict(dict):
    def __getitem__(self, key):
        if key in self: return self.get(key)
        return self.setdefault(key, NestedDict())
它允许我轻松地循环添加到数据库中的新文件(目录中的文件),并将它们附加到加载的NestedDict中,然后,在将数据还原为dict类型后,通过覆盖pickle文件转储它。但是,结构化阵列的解决方案面临这样一个问题:numpy.append使用的是副本,因此需要的内存增加了一倍

我最近发现,您可以使用pickle中的'ab'进行追加,因此可以只添加到数据库中,而无需重新加载所有内容。但是,我不知道这个“ab”将如何影响数据库中下一阶段的分析和搜索。 这还带来了另一个问题,如果我想重新运行一个事件并更新存储的信号,加载完整的字典会自动更新该值,但附加到文件会使我存储另一个字典

我正在寻找有关结构、要使用的库的建议,以及一些我可能完全错误的步骤的说明。我尝试在线查看示例,但大多数示例都使用带有csv、pickles表或字典的虚拟示例,然后加载到panda+sqlalchemy中执行搜索,因此我不确定我的尝试将如何影响下一阶段的处理

我正在寻找的解决方案需要在写入/更新数据文件以及检索某些属性的信号(通常的sql示例)时处理较大的最终数据库大小(>>20GB)