我遇到的情况是,我有几个非常大的字典列表,以及包含在其他地方构建的大量数据的字典,这些数据以非常大的 json 对象传递。我需要从这个大数据堆中获取信息并构建一个包含数据子集的新字典列表。但生成的新词典不能对获取数据的旧词典有任何引用。
示例 考虑以下两个数据源(我们正在尝试使用的真实数据的非常简单的示例):
list_1 = [{ "id": "12", "b": 33, "d": "rty" },
{ "id": "22", "b": 135, "d": "jjj" },
{ "id": "32", "b": 1, "d": "trt" },
{ "id": "42", "b": 1355, "d": "ast" },]
dict_2 = { "12" : { "id": "12", "c": "ada" },
"22" : { "id": "22", "c": "pklm" },
"32" : { "id": "32", "c": "pppf" },
"42" : { "id": "42", "c": "eeef" },}
然后我们想根据这些数据构建一个新的字典列表。规则是,对于 list_a 中值 b 小于 40 的每个字典,我们希望构建一个具有相同 id 以及值 c 和 d 的新字典,并将这个新字典添加到新列表中。
newlist = [{ "id": "12", "c": "ada", "d": "rty" },
{ "id": "32", "c": "pppf", "d": "trt" },
如果我们简单地这样做:
newlist = []
for x in list_1:
if x["b"] < 40:
dict = {"id": x["id"],
"d": x["d"],
"c": (dict_2[x["id"]])["c"] }
newlist.append(dict)
那么 newlist 中的字典将包含对 list_1 和 dict_2 的引用。当您想以我认为的经典方式节省内存时,这一切都很好。
但在我们的例子中,我们不需要参考文献。在创建 newlist 后,我们需要能够从内存中删除 list_1 和 dict_2,这样我们就可以节省内存使用量。 newlist需要继续存在于内存中。 List_1 和 dict_2 非常非常大,生成的 newlist 只是大小的一小部分。
当我们检查模块 memory_profiler 时,我们发现 Python 不会释放 list_1 和 dict_2 使用的内存,因为从这两个源获取的值随后用于在 newlist 中设置值,因此这两个源仍然需要位于因为引用而记忆。 :/
如何在 Python 中完成此操作?可以用Python完成吗?我们如何才能获得真实的副本而不是对来源的引用?现在我们倾向于将 newdict 写入文件,擦除所有内容,然后将 newdict 从文件重新加载到内存中并从那里继续。但这似乎是一个相当粗糙的解决方案。
有什么想法吗?
如果你想打破引用并确保字典不保留任何内存,你可以使用
deep copy
概念。
将
copy.deepcopy()
导入到 Python 文件后,尝试使用 copy
修改现有代码
import copy
#instead of "d": x["d"], use
"d": copy.deepcopy(x["d"])
#do the same for all the list
如果您不想保留以前的列表,可以删除它们。
希望能解决问题。