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

PyN*_*bie 2 python performance dictionary list

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

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

这本字典比我想象的要大得多 - 甚至在内存中构建它也是如此,所以我把它分成三部分,每部分都限于特定范围的公司标识符.

我的计划是使用用户提交的列表并使用字典组来查找公司标识符的用户列表,以匹配预期将找到公司事件的特定newsDict,然后一个接一个地加载newsDicts以获取值.

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

[('identifier','MM/DD/YYYY'),[list of news events for that date]]
Run Code Online (Sandbox Code Playgroud)

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

 companyDict['identifier']=(begofRangeinListforComp,endofRangeinListforComp)
Run Code Online (Sandbox Code Playgroud)

我会使用用户输入来查找我需要的范围,并构建一个按范围排序的标识符和范围列表.然后我会读取列表的相应部分以获取数据并构造输出.

我看到的最大原因是,即使将字典分成三部分,每个部分大约需要两分钟才能加载到我的机器上,字典最终需要大约600到750 mb的ram.

我很惊讶地注意到,一个包含800万行的列表只需要大约15秒的时间来加载并使用大约1/3的字典内存的1/3.

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

我很惊讶,因为我认为字典是最有效的方法.但是我的嘲笑表明字典需要比列表更多的内存.我在SO和其他地方阅读其他帖子表明,任何其他结构都需要比列表指针更昂贵的指针分配.我在这里遗漏了什么,是否有更好的方法来做到这一点?

在阅读了Alberto的回答并回复我的评论后,我花了一些时间试图弄清楚如果我使用数据库如何编写该函数.现在我可能会陷入困境,因为我对db编程知之甚少

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

Alb*_*oPL 5

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