- 内容提要
- 序 1:程序里的世界
- 序 2:最后一层表象
- 关于本书
- 致谢
- 引言:简单的本源
- 篇一:计算系统
- 第 1 章 数,以及对数据的性质的思考
- 第 2 章 逻辑
- 第 3 章 抽象
- 篇二:语言及其面临的系统
- 第 4 章 语言
- 第 5 章 从功能到系统
- 篇三:程序设计的核心思想
- 第 6 章 数据结构:顺序存储
- 第 7 章 数据结构:散列存储
- 第 8 章 执行体与它在执行过程中的环境
- 第 9 章 语法树及其执行过程
- 第 10 章 对象系统:表达、使用与模式
- 篇四:应用开发基础
- 第 11 章 应用开发的背景与成因
- 第 12 章 应用开发技术
- 第 13 章 开发视角下的工程问题
- 第 14 章 应用程序设计语言的复杂性
- 篇五:系统的基础部件
- 第 15 章 分布
- 第 16 章 依赖
- 第 17 章 消息
- 第 18 章 系统
- 篇六:系统的基本组织方法与原理
- 第 19 章 行为的组织及其抽象
- 第 20 章 领域间的组织
- 附一:主要编程范式 及其语言特性关系
- 附二:继承与混合,略谈系统的构建方式
- 附三:像大师们一样思考——从 UML 何时死掉 谈起
- 附四:VCL 已死,RAD 已死
15.6 分布成本与处理成本也是难于平衡的
对于任意一个大型复杂系统来说,如果它能被拆分的话,我们拆分的模式无非上述三种。而且这种从逻辑的视角进行的拆分活动,最终也会表现为数据的拆分,例如子系统与子系统各自的数据库。更进一步地,当我们不再需要考虑这些子系统之间的数据关系时,整个系统将是可持续分布、并行计算的。
虽然从我们目前的分析来看,这一切是成立的,但是现实中的系统往往并不这样简单。其中的问题之一,在于“数据并不总是可以拆分”。例如一个简单的统计日志功能,其原始的需求如下:分析某个日志文件,统计日志的总行数。
缘于这个日志文件过大,我们对日志文件进行了数据拆分:每 100M 数据分成一个文件。这样,我们在整个逻辑上就可以理解为:对于文件 log1.txt 使用逻辑 A1,对于文件 log2.txt 使用逻辑 A2,如此等等;对于整个逻辑,我们将对 A1,…,An返回值求和 9 。
但是 log1.txt,log2.txt,…,logN.txt 这些文件之间却存在着关系。由于数据按 100M 分段,而换行并不总是发生在分段的边界之上,所以 log1.txt 末尾可能有“半行”属于 log2.txt 的第一行……类似这样的关系,使得我们在拆分 log.txt 这个数据总量时存在一些实际限制。
这些数据方面的限制,通常是通过逻辑来弥补的。我们总是试图让“数据拆分”这一活动更简单,或更规则。其简单,意味着分布它的成本很低,例如“数据按 100M 分段”的分布成本仅仅是物理存储上的限制;其规则,意味着处理它的成本很低,例如“数据总是在换行边界上分段”,那么处理它的程序将非常容易写,并且判断逻辑会少很多,执行效率也就高很多。
但如同算法时间与空间复杂度难于平衡一样,分布成本低通常处理成本就高,反之亦然。也就是说,对于既已存在的数据集来说 10 ,简单而又规则地拆分是两难之事。
- 可见“象太大”才是最原始、顶层的根本问题,所谓“大象不能分割”事实上是“化整为零”这个求解方案所带来的第二层问题;而“将大象重量映射为石头重量”,是进一步的求解方案。“映射/如何映射”作为第三层的问题,是远离原始问题的以及其本质的。 ↩
- 这其实并不那么明显。其一, 处理 (process)是函数的基本抽象含义,如同它在数学中的含义是求解;其二, 数据 (data)是处理的具体对象,这是函数入口参数的基本抽象含义,如同数学中的公式是函数,而代入公式的那些数才是求解的问题(即数据)。 ↩
- 引导光盘、引导软盘,以及硬盘活动分区的引导扇区等。 ↩
- 这里仅基于 Windows 系统的“进程-线程”模型进行讨论。事实上这些逻辑单元在不同系统中有着多种类型、多种层次与关系的抽象,例如作业(Job)、任务(Task)、进程(Process)、线程(Thread)、协和(Coroutine)、流(Flow)、事务(Work)、会话(Session)等。 ↩
- 注意这样的实现其实是基于“进程-线程”模型的并发(Concurrency),这些执行体只是在宏观上看来是并行的而已,并非真正意义上的、与串行(Sequential)相对的并行计算(Parallel, Parallel computing)。 ↩
- 这句话的意思是说:我们只好让那些不能拆分的逻辑运行在同一个处理单元中。 ↩
- 如果使用一个自动分布程序来处理函数
foo()
,我们显然只需要进行完整的语法扫描,以确定foo_1
与foo_2
各自使用的那一部分数据即可。 ↩ - 对于在分布环境下的“函数的参数界面”,在 Erlang 中可以理解为消息,而在另外一些基于数据库、数据中心或数据结点的解决方案中,可以理解为持锁的数据项或结点。 ↩
- 在这个问题中,A1,…,An是否是相同的逻辑呢?这并非一个关键问题,因为我们现在仅在讨论数据的分布。 ↩
- 这也提出了数据规划的必要性问题:若我们现在有机会规划这些数据,那么必然能降低将来处理它们的成本。 ↩
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论