python - 从磁盘读取列表会比加载字典更好吗?

标签 python list dictionary performance

我正在构建一个应用程序,我试图允许用户提交公司和日期对的列表,并查明该日期是否有新闻事件。新闻事件存储在字典中,以公司标识符和日期作为键。

newsDict('identifier','MM/DD/YYYY')=[list of news events for that date]

事实证明,这本词典比我想象的要大得多,甚至无法在内存中构建它,因此我将其分成三部分,每部分仅限于特定范围的公司标识符。

我的计划是获取用户提交的列表,并使用字典组将公司标识符的用户列表与预期找到的公司事件的特定 newsDict 相匹配,然后依次加载 newsDict 以获取值.

现在我想知道将新闻事件保存在列表中是否更好,列表中的每个项目都是元组和另一个列表的子列表列表

[('identifier','MM/DD/YYYY'),[list of news events for that date]]

我的想法是我会有一个字典,其中包含每个公司标识符的列表范围

 companyDict['identifier']=(begofRangeinListforComp,endofRangeinListforComp)

我将使用用户输入来查找所需的范围,并构建按范围排序的标识符和范围的列表。然后我只需读取列表的相应部分即可获取数据并构建输出。

我认为这样做的最大原因是,即使字典被分成三部分,每个部分也需要大约两分钟的时间才能加载到我的机器上,并且字典最终会占用大约 600 到 750 MB 的内存。

我惊讶地发现,800 万行的列表只需要大约 15 秒即可加载,并且使用了包含 1/3 条目的字典的约 1/3 内存。

此外,由于我可以在处理列表时丢弃列表中的行,因此在处理用户列表时将释放内存。

我很惊讶,因为我认为字典是执行此操作的最有效方法。但我的研究表明,字典比列表需要更多的内存。我对 SO 和其他地方的其他帖子的阅读表明,任何其他结构都需要比列表指针更昂贵的指针分配。我在这里遗漏了什么吗?有更好的方法吗?

在阅读了阿尔贝托的回答和对我的评论的回应后,我花了一些时间试图弄清楚如果我要使用数据库如何编写该函数。现在我可能会在这里陷入困境,因为我对数据库编程不太了解,但是

我认为使用数据库实现的代码会比以下复杂得多:

outList=[]
massiveFile=open('theFile','r')
for identifier in sortedUserList
# I get the list and sort it by the key of the dictionary 
    identifierList=massiveFile[theDict[identifier]['beginPosit']:theDict[identifier]['endPosit']+1]
    for item in identifierList:
        if item.startswith(manipulation of the identifier)
        outList.append(item)

我必须将其包装在一个函数中,如果我将列表转换为数据库,我没有看到任何相对简单的东西。

当然,简单并不是让我来到这个论坛的原因。我仍然不认为使用其他结构会消耗更少的内存。我有 30000 个公司标识符和大约 3600 个日期。我列表中的每一项都是 OOD 术语中的一个对象。这就是我正在挣扎的地方,今天早上我花了六个小时整理字典的数据,然后才放弃。花费大量的时间来实现一个数据库,然后发现我正在使用其他人的半个或更多内存来加载它,这似乎是有问题的

最佳答案

对于如此大量的数据,您应该使用数据库。这比查看列表要好得多,并且无论如何都是存储数据的最合适的方式。如果您使用 Python,我相信它内置了 SQLite。

关于python - 从磁盘读取列表会比加载字典更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/895500/

相关文章:

python - FFT 后的棋盘格图案

python - 如何在 Python 中将长整数写为二进制?

java - 使用循环 for 将内容添加到 linkedList java

list - 使可扩展列表的背景透明似乎是不可能的。在 StackOverflow 上测试了所有解决方案

algorithm - 寻求有效的算法来分析类似于VBA中数据透视表的数据

python - matplotlib 轮廓 : get Z value under cursor

Python:拆分列表的元素

类内的 Pythonic 开关

matlab - 在 Matlab 的 map 上绘制 3d 条

python - 如何在 Python 中使用循环反转列表的一部分?