fasionchan

读万卷书,行万里路,品万味肴,撸万行码。

Python装饰器高级用法

| Comments

Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的。 在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇! 然而,这只是语法糖而已。

场景

假设,有一些工作函数,用来对数据做不同的处理:

1
2
3
4
5
6
def work_bar(data):
    pass


def work_foo(data):
    pass

我们想在函数调用前/后输出日志,怎么办?

[译文]弹性分布式数据集:一种为内存化集群计算设计的容错抽象

| Comments

摘要

我们提出弹性分布式数据集(RDDs),一种分布式内存模型,以容错的方式在大集群上执行内存计算。 现有计算框架不能有效地处理以下两类问题:①迭代算法;②交互式数据挖掘,RDDs应运而生。 在这两个场景下,确保数据在内存中,性能至少有数量级的提升。 为了高效实现容错性,RDDs采用一个受限的内存共享模型——与其修改共享状态,不如对数据做一些变换(生成新数据集)。 尽管如此,我们发现RDD的表现能力足以完成一系列计算类型,包括最近的专有交互式作业编程模型,例如Pregel,甚至包括先前无法覆盖的模型。 我们在一个名为Spark的计算平台上实现了RDDs,并且已经通过一系列用户应用和基准测试进行验证。

[译文]Spark快速入门教程

| Comments

本文提供一个快速使用Spark的指引。 我们会先通过交互式终端介绍API(使用Python语言),然后介绍怎么用JavaScala或者Python编写一个应用。

开始之前,需要先从Spark官网下载一份Spark发行包。 由于我们不会直接使用HDFS,你可以不用管Hadoop版本。

注意到,Spark2.0之前,主要的编程接口是RDD(Resilient Distributed Dataset/弹性分布式数据集)。 2.0以后,RDD被另一种类似数据集取代,支持强类型而且自带更丰富的优化。 RDD接口依然有效,完整的参考文档在:RDD编程指南。 然而,我们还是推荐使用新版数据集,性能比RDD更好。 更多关于数据集的信息,请参考:SQL编程指南

使用Spark终端做交互式分析

Spark终端(shell)提供一种学习API的快捷方式,以及一系列用于交互式数据分析的强大工具。 它提供了Python版以及Scala(跑在Java虚拟机之上,可以直接使用Java类库)版。 以Python为例,在Spark目录中运行以下命令:

1
./bin/pyspark

[译文]跳表:一种平衡树的概率性替代品

| Comments

跳表是一种可以替代平衡树的数据结构。跳表追求的是概率性平衡,而不是严格平衡。因此,跟平衡二叉树相比,跳表的插入删除操作要简单得多,执行也更快。

二叉树可以用来实现字典和有序表等抽象数据结构。在元素随机插入的场景,二叉树可以很好应对。然而,在有序插入的情况下,二叉树就退化了(链表),性能非常差。如果有办法对待插入元素进行随机排列,二叉树大概率可以运行良好。大部分情况下,插入是在线进行的,因此随机排列并不具有可行性。平衡树在操作时对树结构进行调整以满足平衡条件,因此获得理想性能。

跳表是一种概率性可行的平衡二叉树替代数据结构。跳表通过一个随机数生成器实现平衡。虽然跳表最坏情况下(worst-case)性能也很差,但是没有任何输入序列必然会导致最坏情况发生(这点类似划分元素(pivot point)随机选定的快排)。跳表极度不平衡发生的概率非常低(一个包含250个元素的字典,一次查找需要花3倍期望时间的概率小于百万分之一)。跳表平衡概率跟随机插入的二叉树差不多,好处是插入顺序不要求随机。

Procfs伪文件系统原理

| Comments

Linux系统/proc目录下,有一些特殊的目录和文件,用来展示或者设置内核数据。例如,/proc/meminfo展示系统内存信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
$ cat /proc/meminfo
MemTotal:         506160 kB
MemFree:           73528 kB
MemAvailable:     335160 kB
Buffers:           54756 kB
Cached:           162888 kB
SwapCached:            0 kB
Active:           247648 kB
Inactive:          96840 kB
Active(anon):     127044 kB
Inactive(anon):     4332 kB
Active(file):     120604 kB
Inactive(file):    92508 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               104 kB
Writeback:             0 kB
AnonPages:        126824 kB
Mapped:            14412 kB
Shmem:              4532 kB
Slab:              70608 kB
SReclaimable:      59128 kB
SUnreclaim:        11480 kB
KernelStack:        2928 kB
PageTables:         3028 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      253080 kB
Committed_AS:     530132 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        5536 kB
VmallocChunk:   34359731707 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       69568 kB
DirectMap2M:      454656 kB

这些数据随着系统的变化动态调整,感觉好神奇!

Linux内核模块

| Comments

Linux内核管理着一台计算机的所有资源,为上层应用程序提供统一的编程接口(系统调用),屏蔽底层设备的差异。 由于不同用户物理设备以及对内核功能需求的差异性,需要一种类似插件的运行机制——编写插件实现所需功能,然后嵌入到内核中,与内核形成一个整体。

Linux内核模块便是这样的插件。作为Linux内核的扩展手段,可以在运行时动态加载和卸载。 那么,一个内核模块是怎么编写的呢?与普通程序编写有什么区别呢?

程序开发经常以hello world程序入门,因为这是最简单的。 本文也通过一个最简单的内核模块,演示如何一步步编写一个内核模块。

[译文]MongoDB WiredTiger引擎调优技巧

| Comments

MongoDB3.0开始引入可插拔存储引擎的概念。 当前,有不少存储引擎可供选择:MMAPV1WiredTigerMongoRocksTokuSE等等。 每个存储引擎都有自己的优势,你需要根据性能要求及应用特征挑选最适合的一个。

3.2.x开始,WiredTiger成为默认的存储引擎。 最为MongoDB目前最流行的存储引擎,WiredTiger与原先的MMAPV1相比有以下优势:

  • 性能&并发:在大多数工作负载下,WiredTiger的性能要比MMAPV1高很多。 WiredTiger引擎为现代多核系统量身定制,更好地发挥多核系统的处理能力。 MMAPV1引擎使用表级锁,因此,当某个单表上有并发的操作,吞吐将受到限制。 WiredTiger使用文档级锁,由此带来并发及吞吐的提高。 对于典型的应用,切到WiredTiger引擎,可带来5-10倍的性能提升。

更优雅地造测试数据

| Comments

开发系统时,经常需要一些伪数据用于测试。举个例子,设计一个学生管理系统,测试注册功能,总需要一些用户信息吧。我猜大部分人都会填:用户aaaa,密码1111,手机号码1111……感觉略无追求~

那么有没有办法造一个看上是真的数据呢?肯定是有的——人是活的嘛~

自己造很累,有没有不需要大脑的方法的?还真有,这就是本文要介绍的一个Python模块——Faker

Python调试终端

| Comments

后端服务程序开发运营过程中,难免会遇到一些BUG疑难杂症,是日志输出等调试手段无法定位的。 如有有一个工具,可以连上服务程序,查询服务中间状态或者修改程序变量,势必加速问题定位及解决。

本模块就是您想要的工具~