我的 spark 应用程序使用 RDD 的 numpy 数组。
目前,我正在从 AWS S3 读取我的数据,它表示为
一个简单的文本文件,其中每一行都是一个向量,每个元素由空格分隔,例如:
1 2 3
5.1 3.6 2.1
3 0.24 1.333
我正在使用 numpy 的函数 loadtxt()
以从中创建一个 numpy 数组。
但是,这种方法似乎非常慢,而且我的应用程序花费了太多时间(我认为)将我的数据集转换为 numpy 数组。
你能建议我一个更好的方法吗?例如,我应该将我的数据集保存为二进制文件吗? 我应该以其他方式创建 RDD 吗?
关于我如何创建 RDD 的一些代码:
data = sc.textFile("s3_url", initial_num_of_partitions).mapPartitions(readData)
读取数据函数:
def readPointBatch(iterator):
return [(np.loadtxt(iterator,dtype=np.float64)]
最佳答案
简单地使用 numpy.fromstring
进行映射会更加地道,速度也稍微快一些,如下所示:
import numpy as np.
path = ...
initial_num_of_partitions = ...
data = (sc.textFile(path, initial_num_of_partitions)
.map(lambda s: np.fromstring(s, dtype=np.float64, sep=" ")))
但忽略了您的方法没有特别错误的地方。据我所知,使用基本配置,简单地读取数据大约慢两倍,比创建虚拟 numpy 数组慢一点。
所以看起来问题出在其他地方。这可能是集群配置错误、从 S3 获取数据的成本,甚至是不切实际的期望。
关于python - Spark 最快的创建 numpy 数组 RDD 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33804380/