沼气生产在农业、养殖业、畜牧业升级和城镇化中的作用

2013年耶诞节和2014年新年期间,我们到瑞典探亲。在这之前我好几年没去瑞典了。这次回去我注意到韦斯特罗斯(Västerås)市的公交车是用沼气(biogas/methane/CH4/甲烷)做燃料,而不是通常的汽油或柴油。这种公车的环境污染要比汽柴油低很多,对降低PM2.5会有不少的帮助。岳父告诉我,公车用的沼气,不少一部分来自厨房的废料、剩饭菜、和城市污水处理系统内的人的大小便!

下图是斯德哥尔摩的大沼气公交。目前沼气公交的燃料缩写是CNG,Compressed Natural Gas,不是液化的。液化的压缩率更高。我在网上注意到瑞典的乌普萨拉(Uppsala)有试用液化沼气做公交燃料的项目,不知进展如何。
StockholmBus
这张是瑞典Örebro市沼气公交顶部的燃料箱,更清晰。
OrebroBus

几年前我曾读到我山东老家农村利用农业和生活垃圾生产沼气的试点,但好像最终并不太成功,也没推广。这让我觉得很遗憾。值得欣喜的是,现在政府和公众对改善自然和生活环境非常重视,并且在下大力去做。我以为在这种大环境下,重新推广和促进沼气生产有重大意义:

  • 随着农业机械化和现代化,农作物如秸秆等原料正逐渐丧失以往的肥料和燃料功能,需要处理而不是焚烧,变废为宝。用这些原料造纸是好办法,但用它来生成沼气也很不错;
  • 中国正进行史无前例的大规模城镇化。城镇化质量的一个重要指标是城镇生活垃圾和污水处理。居民的生活垃圾,经过分类整理,可以用来循环和发电;而城镇中的来自居民区和商业区的生活污水里含有人的大小便等有机物(sludge/substrate)污泥。如能和污水处理厂协调结合,利用这些污泥生产沼气,就可以获得能源并减少最终排放物对环境的压力;

    下图是日本横滨污泥沼气生产处理设施。这些污泥来自城市污水系统。
    JapanSludge

  • 城镇化和生活水平提高的另一个后果是人们对肉类蛋白质的需求也越来越多。当然要通过教育宣传等各种方式鼓励人们通过多种方式摄取蛋白质,但城镇化的一个效应确实是大规模的鸡、鸭、猪、羊、牛等养殖业的发展。这当然也会给生活环境带来压力,特别是这些家禽、牲畜的粪便需要处理。这些废料,和上面提到的农业废料如秸秆一样,应当拿来生产沼气。沼气生产后的残余是很好的肥料,能减少目前农村普遍的化肥滥用现象和对工业化肥的依赖。科学处理动物的粪便,也能改善牲畜的生长环境,更加人道,也会提高肉质和利润。

    请注意,城镇污水污泥沼气化后的残余并不适合做农业废料,因为城镇污水管道废物成分复杂,含重金属。瑞典有用这些残余做建筑材料、垃圾场覆盖材料的经验,值得借鉴。

    城镇化同时也会带来餐饮业和食品加工业的发展。这些行业里的垃圾也和人畜的粪便一样,蕴含着大量的能量,当然也应当用来做沼气生产!像今天看到的上海福喜公司用过期肉类做成的麦当劳、肯德基食品,当然不能让人吃,但把这些做原料生产沼气和肥料挺好的。

    下图是西班牙莱里达(Lleida)的一家养猪场。该场的猪粪是一家能源合作社(Som Energia Cooperativa)生产沼气的原料。请注意猪圈地上的缝隙,猪的粪便会落到下面的采集设施,便于收集利用。
    SpanishPigFarm

    下图是美国弗吉尼亚州切萨皮克的牛粪生产完沼气后的残余(digestate),很好的农业肥料。注意这些粪便经过生产沼气处理后,已无异味。今天刚读到老家的一家养鸭场直接把废物排到村外小河,造成严重污染,街坊村民怨声载道。如果利用鸭粪生产沼气和肥料,这种现象就不会发生。
    ChesapeakeBayDigestate

  • 用以上废料生产沼气,能减少它们在自然环境中的厌氧发酵过程,减少自然界生成并释放的沼气,自然也会减少温室效应。同时,我们用沼气能耗后产生的二氧化碳是carbon neutral的:即我们没有额外往大气层释放温室气体,这是和燃煤、燃油的很大不同,对应对全球气候变化起积极作用。用这种方式产生的能源已经很清洁,再加上该能源自产自销,不需要远程运输,会大大减少输送成本
  • 沼气生产能力的建立也给能源农业的发展提供可能,从而提升一个国家和地区的能源独立和能源安全。能源农业,即energy crop,其产品包括玉米、高粱、小米、杂草等。这些产品可以用来生产沼气,沼气液化后体积成百倍的缩小,非常便于储存和运输。这当然可以作为能源储备,减少从中东、美国、俄国、澳大利亚等地长途进口的石油、煤炭、和天然气。

沼气生产和利用是新兴产业。对环境压力日渐增大、城镇化迅猛发展的发展中国家如中国来说,我以为利用废物生产并利用沼气能源对改善环境、提高生活质量、应对全球气候变化、和提高能源独立安全有深远的意义!

又及:前两天才了解到习近平主席和我一样,也是沼气生产的大力推广者。最近看过习近平主席在2004年接受一家电视台的采访,提到是他在下乡当知青时和村民们一起建起了陕西省的第一座沼气池。整个访谈半小时左右,非常值得观看!习近平很有能力,很靠谱,很优秀。

图片来源:
瑞典斯德哥尔摩公交
瑞典Örebro的公交车
日本横滨污水污泥沼气生产处理设施
西班牙莱里达(Lleida)的一家养猪场
美国弗吉尼亚州切萨皮克的牛粪生产完沼气后的残余(digestate)

Comments

JiMetrics now gathers SQL Server startup account

During the last few days, I’ve refactored JiMetrics and added a new function:

  • Used Pester to create more test cases for PowerShell functions I wrote;
  • Enhanced the design and code so JiMetrics also gathers SQL Server instance’s startup account, which can be useful.

If you don’t know what JiMetrics is, go to this page to find out. It’s is a tool that uses SQL Server to gather important SQL Server metrics in your enterprise. No additional software install, no registry change, no files to copy and move around that pollute your system, it only uses SQL Server, which you already have and it just works! It has been pretty useful to me and my co-workers. JiMetrics is open source and free to use. Check it out and let me know what you think.

I will keep improving this. My next objective is to play with SQL Server 2014 column-store and see if I can convert the collection database tables to column-store.

Comments

秸秆利用和记忆中的麦收

今天看到山东环境的关于利用小麦秸秆的微博视频,让我浮想联翩,感慨农村变化之大。

我是70后,我上小学那会儿,麦收季节,公社的初高中还要放假以便收割,叫麦假。那时除脱穗外,全是手工体力。一般的程序是这样的:

  1. 天气方面,不怕烈日炎炎,就怕下雨而耽误收割。同时也怕干燥多风天气,因为怕失火;
  2. 早上出工,拿着镰刀拉着板车(家乡话叫“地排车”)到地里去,我们家乡话叫“下湖”。“下湖”这个词的来源待考。
  3. 先割断几颗小麦,搓在一起放在一边,当扎麦捆的小绳;
  4. 弯下腰,左手握一大撮小麦,右手握镰刀,沿着秸秆底部挥镰割断小麦后把它们放在前一步弄好的麦秸绳上;
  5. 重复上一步,直到收割的小麦可以用麦秸绳打成一捆为止;
  6. 打捆。之后重复前三步,直到麦捆可以装满“地排车”为止;
  7. 人拉着载满麦捆的“地排车”,直到庄南的麦场后卸货;
  8. 重复第2至第6步,直到小麦收割完毕;
  9. 安排使用脱穗机的时间。脱穗机是电动的,这是整个麦收过程中唯一使用高科技的步骤;
  10. 把成把的小麦输入脱穗机,使麦秸和麦穗分离;
  11. 突然忘掉一个农具的名字,就是一个圆柱石头,用牲口拉着在麦穗上碾压,以便麦壳和麦粒分开;
  12. 扬场,这时需要大自然的配合,要有点儿风。扬场的流程如下:用木锨把麦壳和麦粒混合物扬向空中,风吹走麦壳,麦粒落地,完成两者分离的过程。见下图;

    Why we fight

  13. 麦粒要经过晾晒去潮;麦秸要放在一起成堆,上面一般涂上一层泥巴压住,叫麦秸垛;
  14. 麦子可以卖钱,做煎饼,打成白面做大白馍馍等。小麦和小麦的衍生品如大白馍馍(家乡话,馒头的意思)、面条、挂面、饺子等都是稀罕物,庄户人一般自己不吃而用来交公粮、卖点钱。庄户人一般吃瓜干、豆子、棒子等杂粮。非农业的城里人吃农民生产出的白面就多一些。白面也有等级,如七五、八五等,我现在忘了这些等级的含义,期待科普。
  15. 麦秸主要有三种用途:床上用品、燃料和肥料。床上用品方面,可以用来填枕头,制苫(音shan)子。苫子可以看作当时的席梦思床垫,但可以卷起来。燃料就不要解释,用麦秸烧锅还是很方便的。肥料吗,把剩余的麦秸放到粪坑里降解后晾干也可做农田肥料。

直到90年代初甚至中期,麦收的流程都是如此。在世纪之交左右,老家小麦的收割终于做到了机械化。但直到最近,小麦收割机只负责脱粒,麦秸就丢弃在地里。由于农村已经不用麦秸做床上用品,很多人用各种燃气罐做饭,种田时只靠化肥甚至是滥用化肥,麦秸就基本上没人用啦。所以一个简单粗糙的解决办法是焚烧,但这造成烟尘污染并使火灾风险增加,更不用说对于能量和资源的浪费啦。所以当我看到老家山东省提高秸秆综合利用率,我很欣慰!

以下是几个我以为很有意思的参照信息资料:

  • 二战期间,中美是盟国,美战争部制作了一些类似《新闻简报》的宣传片,叫Why we fight/我们为何而战,有一集谈到亚太战区。那一集对中国战区的描述资料里有收麦扬场的画面,见上图,和我记忆中的画面并无二致。在那部影片里还可以听到抗日时的《义勇军进行曲》;
  • 不记得在哪里,很可能是在和菜头的博客里,我看到过伊朗农民收割小麦的图片,和我们以前的收割流程类似;
  • 好几年前,我读过我很喜欢的作家铁凝的短篇小说《麦秸垛》。你如果对以前农村的一些历史、情感、味道有兴趣,建议你拿来读一读。

嗯,我可能还要写一下什么是瓜干。

Comments

Speaking at SQLSaturday Chicago

I will deliver a session for SQLSaturday this coming Saturday, April 26th. I will be discussing “Big Data”: cloud computing, distributed computing, column-store databases, in-memory OLTP databases, Hadoop, machine learning, and data analytics. Hope to see you there.

Comments

Removing duplicate rows in small batches based on date column

Due to double scheduling, some duplicate rows were inserted into the Windows.TableStats table in JiMetrics. To confirm that the table has duplicates, here is the T-SQL script I used. Note that this same script should work in all other major RDBMS platforms like MySQL, Oracle, etc. Adjust table and column names to fit your needs.

SELECT HostID,
       InstanceID,
       DbName,
       SchemaName,
       TableName,
       CAST (CollectionDate AS DATE),
       COUNT (*)
  FROM Windows.TableStats
GROUP BY HostID,
	 InstanceID,
         DbName,
         SchemaName,
         TableName,
         CAST (CollectionDate AS DATE)
HAVING COUNT (*) > 1

So the duplicates need to be removed. In Microsoft SQL Server, that can be accomplished with a Common Table Expression (CTE) using the ROW_NUMBER ranking function, which is a pretty elegant solution.

However, when using DELETE to remove potentially large number of rows, say millions, it is always advisable to do that in small batches. Otherwise, you are risking running out of temp, log space, or even disk space, not to mention that you are potentially creating bigger and coarser locks than necessary.

So I decided to remove the duplicates on a daily basis to lessen the impact on the database instance. A runningDate variable is used and incremented by one until the desired end date. Within each iteration of the loop, that day’s duplicates are removed. Tweak it to suit your needs.

I think things like this make a good job interview question for a database administrator.

DECLARE @runningDate DATE
SET @runningDate = '20140101'

WHILE (@runningDate < '20140406')
BEGIN
   WITH dupRows
        AS (SELECT RecordID,
                   ROW_NUMBER ()
                      OVER (PARTITION BY HostID,
                                         InstanceID,
					 DbName,
                                         SchemaName,
                                         TableName,
                                         cast (CollectionDate AS DATE)
                            ORDER BY
                               HostID,
			       InstanceID,
                               DbName,
                               SchemaName,
                               TableName)
                      AS RankID
              FROM Windows.TableStats
             WHERE CAST (CollectionDate AS DATE) = @runningDate)
   DELETE dupRows
    WHERE RankID > 1

   SET @runningDate = DATEADD (DAY, 1, @runningdate)
END

Comments

« Previous entries