Python 将数据结构(集合)存储为文件,但不将其加载到内存中
我有一个2gb的文本文件,用于过滤我不经常访问的python程序使用的值。我通过将每一行装入一个集合并执行fast contains检查来实现这一点。起初,当文件大小只有几兆字节时,这是一个好主意,但一年后,文件增长了,初始加载时间变得难以管理,尽管我基本上没有限制的RAMPython 将数据结构(集合)存储为文件,但不将其加载到内存中,python,Python,我有一个2gb的文本文件,用于过滤我不经常访问的python程序使用的值。我通过将每一行装入一个集合并执行fast contains检查来实现这一点。起初,当文件大小只有几兆字节时,这是一个好主意,但一年后,文件增长了,初始加载时间变得难以管理,尽管我基本上没有限制的RAM 在用基于文件的二进制搜索替换现有代码之前,我想问一下,是否有任何方法可以将set功能直接用作磁盘上的文件?我知道有一些工具可以存储数据结构并将其加载到内存中,但加载部分是这里的问题。最好的办法是将其存储到数据库中。Mongo
在用基于文件的二进制搜索替换现有代码之前,我想问一下,是否有任何方法可以将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:
在找到数据库或索引文件解决方案之前,作为一种临时方法如何
- 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/包含以任何其他字符开头的所有值
- 您的文件加载速度更快(每个文件占用空间都应显著减少)且仅在需要时按需(流)加载
- 比较速度更快,因为检查的值较少李>
- 因为您有无限的内存,即使在比较过程中加载了所有文件,它也会被删除。不会产生问题李>
- 最后,您可以使用线程来更快地加载文件,并可以将比较任务传递给多个线程(如果需要)
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'}
``