原型——这是处理大数据时最重要的事情。明智地将其分割,以便您可以将其加载到内存中以使用解释器(例如 python、R)访问它。这是大规模创建和优化分析流程的最佳方式。
换句话说,修剪您的数 GB 大小的数据文件,使它们足够小以执行命令行分析。
这是我用来做这件事的工作流程——当然不是最好的方法,但它是一种方法,而且它有效:
I.使用您选择的语言中可用的延迟加载方法(希望如此)来读取大型数据文件,尤其是那些超过 1 GB 的文件。然后,我建议根据我在下面讨论的技术处理此数据流,然后最终将这些完全预处理的数据存储在数据集市或中间暂存容器中。
使用 Python延迟加载大型数据文件的一个示例:
# 'filename' is the full path name for a data file whose size
# exceeds the memory on the box it resides. #
import tokenize
data_reader = open(some_filename, 'r')
tokens = tokenize.generate_tokens(reader)
tokens.next() # returns a single line from the large data file.
二、 美白和重铸:
三、 采样:按长度修剪您的数据。
四。降维:正交模拟采样。识别对因变量(又名“结果”或响应变量)没有影响或影响微乎其微的变量(列/字段/特征),并将它们从您的工作数据立方体中消除。
主成分分析(PCA) 是一种简单而可靠的技术来做到这一点:
import numpy as NP
from scipy import linalg as LA
D = NP.random.randn(8, 5) # a simulated data set
# calculate the covariance matrix: #
R = NP.corrcoef(D, rowvar=1)
# calculate the eigenvalues of the covariance matrix: #
eigval, eigvec = NP.eig(R)
# sort them in descending order: #
egval = NP.sort(egval)[::-1]
# make a value-proportion table #
cs = NP.cumsum(egval)/NP.sum(egval)
print("{0}\t{1}".format('eigenvalue', 'var proportion'))
for i in range(len(egval)) :
print("{0:.2f}\t\t{1:.2f}".format(egval[i], cs[i]))
eigenvalue var proportion
2.22 0.44
1.81 0.81
0.67 0.94
0.23 0.99
0.06 1.00
如您所见,前三个特征值占原始数据中观察到的方差的 94%。根据您的目的,您通常可以通过删除最后两列来修剪原始数据矩阵 D:
D = D[:,:-2]
V. 数据集市存储:在永久存储(数据仓库)和分析流程之间插入一层. 换句话说,严重依赖数据集市/数据立方体——位于数据仓库和分析应用层之间的“暂存区”。对于您的分析应用程序来说,这个数据集市是一个更好的 IO 层。R 的“数据框”或“数据表”(来自同名的 CRAN 包)是很好的候选者。我还强烈推荐 redis——超快的读取速度、简洁的语义和零配置,使其成为此用例的绝佳选择。redis 将轻松处理您在问题中提到的大小的数据集。例如,在 redis 中使用 hash 数据结构,您可以拥有与 MySQL 或 SQLite 相同的结构和相同的关系灵活性,而无需繁琐的配置。另一个优点:与 SQLite 不同,redis 实际上是一个数据库服务器. 我实际上是 SQLite 的忠实粉丝,但我相信 redis 在这里工作得更好,因为我刚刚给出的原因。
from redis import Redis
r0 = Redis(db=0)
r0.hmset(user_id : "100143321, {sex : 'M', status : 'registered_user',
traffic_source : 'affiliate', page_views_per_session : 17,
total_purchases : 28.15})