如何实现由文件支持的大量增长的Python列表,并且不会在任何时候加载到内存中

问题描述 投票:0回答:1

我有一个python脚本需要维护一些值作为列表,并每隔n秒无限期地附加到列表,直到用户退出脚本。我希望列表是文件备份,我可以附加到该列表而不将列表内容加载到内存中,将在内存中唯一的部分将是要追加的值。

我尝试了Shelve,但在运行一些测试后我发现在某些时候我将不得不将现有的持久列表加载到内存中并追加到它,使用writeback = true,它将整个文件保存到内存中并写入文件最后只。

脚本是这样的: -

d = shelve.open( reportDir+curDatName+ ( processName.rsplit('.', 1)[0] if processName.endswith('.exe') else processName ))
    global counter
    global startTime

    d['CPU|'+pid] = []
    d['RAM|'+pid] = []
    d['THREADS|'+pid] = []

    startTime = datetime.datetime.now()
    while(not quit):
        print('Took a snapshot')
        counter = counter + 1
        p = psutil.Process(int(pid))
        list = d['CPU|'+pid]
        print(list)
        list.append(p.cpu_percent(0.1)/psutil.cpu_count(0.1))
        d['CPU|'+pid] = list
        print('CPU '+ str(p.cpu_percent(0.1)/psutil.cpu_count(0.1)))
        list = d['RAM|'+pid]
        list.append(p.memory_percent())
        d['RAM|'+pid] = list
        print('RAM '+ str(p.memory_percent()))
        list = d['THREADS|'+pid]
        list.append(p.num_threads())
        d['THREADS|'+pid] = list
        print('Threads- '+ str(p.num_threads()))
        print(d['RAM|'+pid])
        i=0
        while(not quit and i < interval/chunkWait): #wait in chunks
            i = i+1
            time.sleep(chunkWait)

还有其他软件包可以为我实现所需的功能吗?

python
1个回答
0
投票

您希望使用列表(内存数据结构)来存储太大而无法在内存中方便地存储的数据。您正在要求一些软件包允许您假装您正在使用列表,而实际上您正在处理类似于列表的接口,实际上它具有基于磁盘的后备存储。这将是方便的,并且至少有一个我认识的一流专有API,用于供应商自己的数据库(因此不是通用的)。毫无疑问,有人在某个地方提出了一个类似通用列表的数据库表接口,但这只是语法糖。我怀疑你将不得不放弃你的列表方法并学习数据库API。这不是一个提出这些建议的论坛,但我认为我不会因为说mysql是免费的并且声誉很好而受到抨击或贬低。

© www.soinside.com 2019 - 2024. All rights reserved.