Python 将数据结构(集合)存储为文件,但不将其加载到内存中

Python 将数据结构(集合)存储为文件,但不将其加载到内存中,python,Python,我有一个2gb的文本文件,用于过滤我不经常访问的python程序使用的值。我通过将每一行装入一个集合并执行fast contains检查来实现这一点。起初,当文件大小只有几兆字节时,这是一个好主意,但一年后,文件增长了,初始加载时间变得难以管理,尽管我基本上没有限制的RAM 在用基于文件的二进制搜索替换现有代码之前,我想问一下,是否有任何方法可以将set功能直接用作磁盘上的文件?我知道有一些工具可以存储数据结构并将其加载到内存中,但加载部分是这里的问题。最好的办法是将其存储到数据库中。Mongo

我有一个2gb的文本文件,用于过滤我不经常访问的python程序使用的值。我通过将每一行装入一个集合并执行fast contains检查来实现这一点。起初,当文件大小只有几兆字节时,这是一个好主意,但一年后,文件增长了,初始加载时间变得难以管理,尽管我基本上没有限制的RAM


在用基于文件的二进制搜索替换现有代码之前,我想问一下,是否有任何方法可以将set功能直接用作磁盘上的文件?我知道有一些工具可以存储数据结构并将其加载到内存中,但加载部分是这里的问题。

最好的办法是将其存储到数据库中。MongoDB可以很好地处理设置。然后,您可以像查询集合一样查询数据库

你必须安装

sudo apt install mongodb-server-core
pip3 install pymongo
And create a /data/db directory on your drive with the right permissions then run
mongod &
before this code will work:

在找到数据库或索引文件解决方案之前,作为一种临时方法如何

  • 根据关键字开头的字符,将关键字文件分为多个文件(37)。e、 g

    • keys_startwith_a.txt/包含以“a”或“a”开头的所有值
    • keys_startwith_z.txt/包含以“z”或“z”开头的所有值
    • keys_startwith_0.txt/包含以“0”开头的所有值

    • keys_startwith_9.txt/包含以“9”开头的所有值
    • keys_startwith_others.txt/包含以任何其他字符开头的所有值
  • 将每个文件的读取机制更改为流。e、 g

  • io.read(文件,缓冲区=1)

    现在,如果要比较值,只需检查键开始的字符,并与相应文件中的值进行比较

    用这个

    • 您的文件加载速度更快(每个文件占用空间都应显著减少)且仅在需要时按需(流)加载
    • 比较速度更快,因为检查的值较少
    • 因为您有无限的内存,即使在比较过程中加载了所有文件,它也会被删除。不会产生问题
    • 最后,您可以使用线程来更快地加载文件,并可以将比较任务传递给多个线程(如果需要)

    你想要的是一个数据库,
    sqlite3
    可以工作,而且它附带了Python开箱即用,因此没有外部依赖项。@juanpa.arrivillaga这可能是我将用来将二进制搜索卸载到db的方法,我不确定为什么我没有想到它,因为它显然已经大量使用sqlite。是的,不要重新发明轮子。只需确保在搜索列中为表编制索引即可。
    
    from pymongo import MongoClient
    client = MongoClient()
    
    client = MongoClient('localhost', 27017)
    
    #client = MongoClient('mongodb://localhost:27017')
    
    
    db = client.pymongo_test
    
    posts = db.posts
    post_data = {
        'title': 'Python and MongoDB',
        'content': 'PyMongo is fun, you guys',
        'author': 'Bill'
    }
    result = posts.insert_one(post_data)
    print('One post: {0}'.format(result.inserted_id))
    
    bills_post = posts.find_one({'author': 'Bill'})
    print(bills_post)
    
    One post: 5dc61c0cc2b75ebc458da31f
    {'_id': ObjectId('5dc61bf76071bde943ca262b'), 'title': 'Python and MongoDB', 'content': 'PyMongo is fun, you guys', 'author': 'Bill'}
    ``