【发布时间】:2018-02-23 23:18:32
【问题描述】:
对于 python 数据帧,info() 函数提供内存使用。 pyspark 中是否有任何等价物? 谢谢
【问题讨论】:
-
@MaxU 这个程序的内存使用单位是什么。
标签: python apache-spark dataframe pyspark
对于 python 数据帧,info() 函数提供内存使用。 pyspark 中是否有任何等价物? 谢谢
【问题讨论】:
标签: python apache-spark dataframe pyspark
确定数据集所需内存消耗量的最佳方法是创建一个 RDD,将其放入缓存中,然后查看 Web UI 中的“存储”页面。该页面会告诉你 RDD 占用了多少内存。
要估计特定对象的内存消耗,请使用 SizeEstimator 的估计方法。这对于尝试不同的数据布局以减少内存使用量以及确定广播变量将在每个执行程序堆上占用的空间量很有用。
【讨论】:
我有一些想法,这只是一个粗略的估计。据我所知,spark 没有直接的方法来获取数据帧内存使用情况,但 Pandas 数据帧可以。所以你能做的就是。
sample = df.sample(fraction = 0.01)
pdf = sample.toPandas()pdf.info()获取pandas数据帧内存使用情况
【讨论】:
尝试使用the _to_java_object_rdd() function:
import py4j.protocol
from py4j.protocol import Py4JJavaError
from py4j.java_gateway import JavaObject
from py4j.java_collections import JavaArray, JavaList
from pyspark import RDD, SparkContext
from pyspark.serializers import PickleSerializer, AutoBatchedSerializer
# your dataframe what you'd estimate
df
# Helper function to convert python object to Java objects
def _to_java_object_rdd(rdd):
""" Return a JavaRDD of Object by unpickling
It will convert each Python object into Java object by Pyrolite, whenever the
RDD is serialized in batch or not.
"""
rdd = rdd._reserialize(AutoBatchedSerializer(PickleSerializer()))
return rdd.ctx._jvm.org.apache.spark.mllib.api.python.SerDe.pythonToJava(rdd._jrdd, True)
# First you have to convert it to an RDD
JavaObj = _to_java_object_rdd(df.rdd)
# Now we can run the estimator
sc._jvm.org.apache.spark.util.SizeEstimator.estimate(JavaObj)
【讨论】:
SizeEstimator 表示,它计算每个执行程序上占用的对象的 JVM 堆大小。使用这种方法有什么注意事项吗?在运行它之前我需要持久化或缓存数据帧吗?我可以期望结果有多少差异。我在一个估计大小从 500 到 1400 MB 不等的大数据帧上运行它。
下面呢?它以 KB 为单位,X100 以获得估计的实际大小。
df.sample(fraction = 0.01).cache().count()
【讨论】:
您可以将数据帧保存在内存中,并以 df.count() 的形式执行操作。您可以在 spark web ui 的存储选项卡下检查大小。如果它适合您,请告诉我。
【讨论】: