如何释放 pyspark 模型(JavaModel)占用的内存?
How to free the memory taken by a pyspark model (JavaModel)?
如上所述,我通过 pyspark 加载了经过训练的 word2vec 模型。
word2vec_model = Word2VecModel.load("saving path")
使用后,我想删除它,因为它会在单个节点上占用大量内存 space(我使用了 findSynonyms 函数,文档说它应该只在本地使用)
我尝试使用
del word2vec_model
gc.collect()
不过好像没话说。而且它不是 rdd 文件,我不能使用 .unpersist()。我在文档中没有找到类似 unload() 的函数。
有谁可以帮助我或给我一些建议吗?
您可以通过 运行 以下语句确保对象被 py4j 网关取消引用:
给定 word2vec_model
一个 pyspark Transformer
:
- 给定
spark
个 SparkSession
:
spark.sparkContext._gateway.detach(word2vec_model._java_obj)
- ... 或给出
sc
一个 SparkContext
:
sc._gateway.detach(word2vec_model._java_obj)
解释:
- 访问底层包装器对象:您的模型是一个 pyspark
Transformer
,每个转换器在私有 _java_obj
中持有一个 JavaObject
的实例属性。
- 访问
SparkContext
的 py4j 网关。
- 在包装器对象(
JavaObject
的实例)上使用网关的 detach
方法
如上所述,我通过 pyspark 加载了经过训练的 word2vec 模型。
word2vec_model = Word2VecModel.load("saving path")
使用后,我想删除它,因为它会在单个节点上占用大量内存 space(我使用了 findSynonyms 函数,文档说它应该只在本地使用) 我尝试使用
del word2vec_model
gc.collect()
不过好像没话说。而且它不是 rdd 文件,我不能使用 .unpersist()。我在文档中没有找到类似 unload() 的函数。
有谁可以帮助我或给我一些建议吗?
您可以通过 运行 以下语句确保对象被 py4j 网关取消引用:
给定 word2vec_model
一个 pyspark Transformer
:
- 给定
spark
个SparkSession
:
spark.sparkContext._gateway.detach(word2vec_model._java_obj)
- ... 或给出
sc
一个SparkContext
:
sc._gateway.detach(word2vec_model._java_obj)
解释:
- 访问底层包装器对象:您的模型是一个 pyspark
Transformer
,每个转换器在私有_java_obj
中持有一个JavaObject
的实例属性。 - 访问
SparkContext
的 py4j 网关。 - 在包装器对象(
JavaObject
的实例)上使用网关的detach
方法