请问大家, 有没有办法把 Python 的 dict, 存储到一段连续内存上

2022-07-25 15:08:32 +08:00
 wcsjtu

比如说, 我这里有个

table: Dict[str, List[str]] = {
	"key1": ["value1", "value2", ...],
    ...,
    "keyn": ["valuem", ...]
}

我想把这个 dict 中的所有对象(包括所有的 key, value, 以及 list), 全部存储到一段连续内存里, 同时还能支持查表操作, 比如说

values: List[str] = table_in_contigious_memory["key1"]

有没有现成的轮子可以做这种事啊。

PS: 可以不是 Python 原生的 Dict, 只要是 dict-like, 支持查表就行.....

6070 次点击
所在节点    Python
85 条回复
daxin945
2022-07-25 16:20:52 +08:00
lmdb ?
liuxingdeyu
2022-07-25 16:22:24 +08:00
为啥要连续内存的 dict
wcsjtu
2022-07-25 16:38:39 +08:00
@lysS 因为可以扔到共享内存里, 多个进程可以共享一份词表。
wcsjtu
2022-07-25 16:42:06 +08:00
@ipwx 确实是是内存放不下, 单个表大概占 3G 的内存。 这个表确实是只读的。我之前用的就是 fork , 但是 fork 不管用, 对于 Python 来说,由于每次 read 都会改引用计数,所以是 copy-on-read .....
wcsjtu
2022-07-25 16:45:08 +08:00
@zyx199199 我还没深入去了解这两个库, 但是根据我理解,这两个库,都是要序列化的......性能不行啊
ipwx
2022-07-25 16:45:33 +08:00
@wcsjtu 在我的经验中不是这样的啊,os.fork 我确实用的很舒服。

要么你试试 numpy.ndarray 能不能 fork 共享。
wcsjtu
2022-07-25 16:46:35 +08:00
@ipwx np.ndarray 是可以的, 但是有两个问题

- np 存字符串太浪费内存了......
- np 没办法存 dict
TimePPT
2022-07-25 17:18:09 +08:00
你这是基于啥需求啊……
wcsjtu
2022-07-25 17:40:00 +08:00
@TimePPT 想把 Python 的大 dict 存到共享内存里, 节约内存。。。。。
786375312123
2022-07-25 17:40:56 +08:00
786375312123
2022-07-25 17:41:46 +08:00
@wcsjtu 为了节约内存你用 python ?你是不是队 python 有什么误解?
maggch97
2022-07-25 17:41:56 +08:00
我发现很多奇葩需求,原因都是开发人员只懂 a ,导致有了问题 b ,最终想用一个非常奇葩的 c 方法来解决。
maggch97
2022-07-25 17:48:12 +08:00
你都用 dict 了,逻辑必然不复杂,全都用 c++写这段逻辑不行吗,最终把封装好的查询接口暴露出去。

看到你上面在纠结序列化速度的问题,除非你暴露给用户的接口就是裸的 dict 查询,否则返回结果的那点序列化时间根本无足轻重。如果是暴露 dict 接口,那查询时间本来就无所谓了,你反正都要走网络或者 rpc 等等协议
listenerri
2022-07-25 17:53:32 +08:00
要不试试 zeromq 和它所支持的 ipc 进程间通讯,这样 dict 不用暴露给其他进程,本机跨进程通讯所传输的数据几乎只有一个字符串 key ,想来效率还是可以的
VYSE
2022-07-25 17:59:01 +08:00
DonDonc
2022-07-25 18:00:31 +08:00
listenerri
2022-07-25 18:06:04 +08:00
@VYSE #35 楼主期望避免序列化
Muniesa
2022-07-25 18:07:57 +08:00
numpy 的 Structured arrays ?
xuelu520
2022-07-25 18:16:07 +08:00
那有没有一种可能,现在内存这么便宜,直接加内存呢?
sivacohan
2022-07-25 18:19:59 +08:00
sqlite memory 表?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868557

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX