HashMap的初始容量和装载因子

HashMap的初始容量和装载因子
HashMap的初始容量和装载因子

HashMap的初始容量(initialCapacity)和装载因子(loadFactor)

按HashMap源码里的那种重构方法,如果reHash过多,显然会影响性能。所以为了防止过多的reHash,我们需要自己配置HashMap的装载因子loadFactor和初始的table容量capacity的大小(可以在构造函数里配或者调用方法配)。

很容易理解,如果我们已经知道我们使用的HashMap一般情况的存储在1W对以上,你给它一个默认的16的初始的table容量,默认reHash每次容量翻倍,这得重构多少次呀!(如果装载因子为1,还得要约5~6次)。但是如果我们的对HashMap的容量需求不是很大,你给它一个默认1W的容量,显然又浪费宝贵的空间了。至于这两个参数的选择可以自己去把握,甚至可以设定动态绑定:分析历史数据,找出规律,或者预测未来的走向找出规律。对HashMap这两个参数实现一个动态的调整。比如早上8点~9点A业务比较忙,它对应的HashMap可以提前多给些空间,而10点以后B业务使用的HashMap比较忙,A相对清闲,可以缩减A的空间给B。

如果从数据库的表中读取记录存入HashMap中,完全可以根据记录的行数(row size)来初始化HashMap的容量,这样就可以达到reHash的最少次数,同时也保证了HashMap 所需的最小容量:

比如:通过SQL语句:select count(字段) as rowSize from 表

提到行数: rowSize = 30

那么我们在定义HashMap的时候:HashMap h = new HashMap(rowSize,1f);

下面是HashMap的相关源代码部分:

_____________________________________________

//HashMap的构造

public HashMap(int initialCapacity, float loadFactor) {

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal initial capacity: " +

initialCapacity);

if (initialCapacity > MAXIMUM_CAPACITY)

initialCapacity = MAXIMUM_CAPACITY;

if (loadFactor <= 0 || Float.isNaN(loadFactor))

throw new IllegalArgumentException("Illegal load factor: " +

loadFactor);

// Find a power of 2 >= initialCapacity

int capacity = 1;

while (capacity < initialCapacity)

capacity <<= 1;

this.loadFactor = loadFactor;

threshold = (int)(capacity * loadFactor);

table = new Entry[capacity];

init();

}

public V put(K key, V value) {

if (key == null)

return putForNullKey(value);

int hash = hash(key.hashCode());

int i = indexFor(hash, table.length);

for (Entry e = table[i]; e != null; e = e.next) {

Object k;

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {

V oldValue = e.value;

e.value = value;

e.recordAccess(this);

return oldValue;

}

}

modCount++;

addEntry(hash, key, value, i);

return null;

}

//添加新的项目

void addEntry(int hash, K key, V value, int bucketIndex) {

Entry e = table[bucketIndex];

table[bucketIndex] = new Entry(hash, key, value, e);

if (size++ >= threshold) //注意理解这里,当前的实际大小(size)与threshold相等时,就将当前的容量扩大一倍

{

resize(2 * table.length);

}

}

//重构大小

void resize(int newCapacity) {

Entry[] oldTable = table;

int oldCapacity = oldTable.length;

if (oldCapacity == MAXIMUM_CAPACITY) {

threshold = Integer.MAX_VALUE;

return;

}

Entry[] newTable = new Entry[newCapacity];

transfer(newTable);

table = newTable;

threshold = (int)(newCapacity * loadFactor);

}

HashMap的数据结构

HashMap主要是用数组来存储数据的,我们都知道它会对key进行哈希运算,哈系运算会有重复的哈希值,对于哈希值的冲突,HashMap采用链表来解决的。在HashMap里有这样的一句属性声明:transient Entry[] table;

Entry就是HashMap存储数据所用的类,它拥有的属性如下

final K key;

V value;

final int hash;

Entry next;

看到next了吗?next就是为了哈希冲突而存在的。比如通过哈希运算,一个新元素应该在数组的第10个位置,但是第10个位置已经有Entry,那么好吧,将新加的元素也放到第10个位置,将第10个位置的原有Entry赋值给当前新加的Entry的next属性。数组存储的是链表,链表是为了解决哈希冲突的,这一点要注意。

几个关键的属性

存储数据的数组

transient Entry[] table;这个上面已经讲到了

默认容量

static final int DEFAULT_INITIAL_CAPACITY = 16;

最大容量

static final int MAXIMUM_CAPACITY = 1 << 30;

默认加载因子,加载因子是一个比例,当HashMap的数据大小>=容量*加载因子时,HashMap会将容量扩容

static final float DEFAULT_LOAD_FACTOR = 0.75f;

当实际数据大小超过threshold时,HashMap会将容量扩容,threshold=容量*加载因子

int threshold;

加载因子

final float loadFactor;

HashMap的初始过程

构造函数1

public HashMap(int initialCapacity, float loadFactor) {

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal initial capacity: " +

initialCapacity);

if (initialCapacity > MAXIMUM_CAPACITY)

initialCapacity = MAXIMUM_CAPACITY;

if (loadFactor <= 0 || Float.isNaN(loadFactor))

throw new IllegalArgumentException("Illegal load factor: " +

loadFactor);

// Find a power of 2 >= initialCapacity

int capacity = 1;

while (capacity < initialCapacity)

capacity <<= 1;

this.loadFactor = loadFactor;

threshold = (int)(capacity * loadFactor);

table = new Entry[capacity];

init();

}

重点注意这里

while (capacity < initialCapacity)

capacity <<= 1;

capacity才是初始容量,而不是initialCapacity,这个要特别注意,如果执行new HashMap(9,0.75);那么HashMap的初始容量是16,而不是9,想想为什么吧。

构造函数2

public HashMap(int initialCapacity) {

this(initialCapacity, DEFAULT_LOAD_FACTOR);

}

构造函数3,全部都是默认值

public HashMap() {

this.loadFactor = DEFAULT_LOAD_FACTOR;

threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);

table = new Entry[DEFAULT_INITIAL_CAPACITY];

init();

}

构造函数4

public HashMap(Map m) {

this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,

DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);

putAllForCreate(m);

}

如何哈希

HashMap并不是直接将对象的hashcode作为哈希值的,而是要把key的hashcode作一些运算以得到最终的哈希值,并且得到的哈希值也不是在数组中的位置哦,无论是get还是put还是别的方法,计算哈希值都是这一句:

int hash = hash(key.hashCode());

hash函数如下:

static int hash(int h) {

return useNewHash ? newHash(h) : oldHash(h);

}

useNewHash声明如下:

private static final boolean useNewHash;

static { useNewHash = false; }

这说明useNewHash其实一直为false且不可改变的,hash函数里对useNewHash的判断真是多余的。

private static int oldHash(int h) {

h += ~(h << 9);

h ^= (h >>> 14);

h += (h << 4);

h ^= (h >>> 10);

return h;

}

private static int newHash(int h) {

// This function ensures that hashCodes that differ only by

// constant multiples at each bit position have a bounded

// number of collisions (approximately 8 at default load factor).

h ^= (h >>> 20) ^ (h >>> 12);

return h ^ (h >>> 7) ^ (h >>> 4);

}

其实HashMap的哈希函数会一直都是oldHash。

如果确定数据的位置

看下面两行

int hash = hash(k.hashCode());

int i = indexFor(hash, table.length);

第一行,上面讲过了,是得到哈希值,第二行,则是根据哈希指计算元素在数组中的位置了,位置的计算是将哈希值和数组长度按位与运算。

static int indexFor(int h, int length) {

return h & (length-1);

}

put方法到底作了什么?

public V put(K key, V value) {

if (key == null)

return putForNullKey(value);

int hash = hash(key.hashCode());

int i = indexFor(hash, table.length);

for (Entry e = table[i]; e != null; e = e.next) {

Object k;

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {

V oldValue = e.value;

e.value = value;

e.recordAccess(this);

return oldValue;

}

}

modCount++;

addEntry(hash, key, value, i);

return null;

}

如果key为NULL,则是单独处理的,看看putForNullKey方法:

private V putForNullKey(V value) {

int hash = hash(NULL_KEY.hashCode());

int i = indexFor(hash, table.length);

for (Entry e = table[i]; e != null; e = e.next) {

if (e.key == NULL_KEY) {

V oldValue = e.value;

e.value = value;

e.recordAccess(this);

return oldValue;

}

}

modCount++;

addEntry(hash, (K) NULL_KEY, value, i);

return null;

}

NULL_KEY的声明:static final Object NULL_KEY = new Object();

这一段代码是处理哈希冲突的,就是说,在数组某个位置的对象可能并不是唯一的,它是一个链表结构,根据哈希值找到链表后,还要对链表遍历,找出key相等的对象,替换它,并且返回旧的值。

for (Entry e = table[i]; e != null; e = e.next) {

if (e.key == NULL_KEY) {

V oldValue = e.value;

e.value = value;

e.recordAccess(this);

return oldValue;

}

}

如果遍历完了该位置的链表都没有找到有key相等的,那么将当前对象增加到链表里面去

modCount++;

addEntry(hash, (K) NULL_KEY, value, i);

return null;

且看看addEntry方法

void addEntry(int hash, K key, V value, int bucketIndex) {

Entry e = table[bucketIndex];

table[bucketIndex] = new Entry(hash, key, value, e);

if (size++ >= threshold)

resize(2 * table.length);

}

table[bucketIndex] = new Entry(hash, key, value, e);新建一个Entry对象,并放在当前位置的Entry

链表的头部,看看下面的Entry构造函数就知道了,注意红色部分。

Entry(int h, K k, V v, Entry n) {

value = v;

next = n;

key = k;

hash = h;

}

如何扩容?

当put一个元素时,如果达到了容量限制,HashMap就会扩容,新的容量永远是原来的2倍。

上面的put方法里有这样的一段:

if (size++ >= threshold)

resize(2 * table.length);

这是扩容判断,要注意,并不是数据尺寸达到HashMap的最大容量时才扩容,而是达到threshold指定的值时就开始扩容,threshold=最大容量*加载因子。看看resize方法

void resize(int newCapacity) {

Entry[] oldTable = table;

int oldCapacity = oldTable.length;

if (oldCapacity == MAXIMUM_CAPACITY) {

threshold = Integer.MAX_VALUE;

return;

}

Entry[] newTable = new Entry[newCapacity];

transfer(newTable);

table = newTable;

threshold = (int)(newCapacity * loadFactor);

}

重点看看红色部分的transfer方法

void transfer(Entry[] newTable) {

Entry[] src = table;

int newCapacity = newTable.length;

for (int j = 0; j < src.length; j++) {

Entry e = src[j];

if (e != null) {

src[j] = null;

do {

Entry next = e.next;

int i = indexFor(e.hash, newCapacity);

e.next = newTable[i];

newTable[i] = e;

e = next;

} while (e != null);

}

}

}

tranfer方法将所有的元素重新哈希,因为新的容量变大,所以每个元素的哈希值和位置都是不一样的。正确的使用HashMap

1:不要在并发场景中使用HashMap

HashMap是线程不安全的,如果被多个线程共享的操作,将会引发不可预知的问题,据sun的说法,在扩容时,会引起链表的闭环,在get元素时,就会无限循环,后果是cpu100%。

看看get方法的红色部分

public V get(Object key) {

if (key == null)

return getForNullKey();

int hash = hash(key.hashCode());

for (Entry e = table[indexFor(hash, table.length)];

e != null;

e = e.next) {

Object k;

if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

return e.value;

}

return null;

}

2:如果数据大小是固定的,那么最好给HashMap设定一个合理的容量值

根据上面的分析,HashMap的初始默认容量是16,默认加载因子是0.75,也就是说,如果采用HashMap的默认构造函数,当增加数据时,数据实际容量超过10*0.75=12时,HashMap就扩容,扩容带来一系列的运算,新建一个是原来容量2倍的数组,对原有元素全部重新哈希,如果你的数据有几千几万个,而用默认的HashMap构造函数,那结果是非常悲剧的,因为HashMap不断扩容,不断哈希,在使用HashMap的场景里,不会是多个线程共享一个HashMap,除非对HashMap包装并同步,由此产生的内存开销和cpu开销在某些情况下可能是致命的。

塔板理论

第二章 气相色谱分析gas chromatographic analysis,GC 第二节 色谱理论基础fundamental of chromatograph theory 色谱理论需要解决的问题:色谱分离过程的热力学和动力学问题。影响分离及柱效的因素与提高柱效的途径,柱效与分离度的评价指标及其关系。 组分保留时间为何不同色谱峰为何变宽 组分保留时间:色谱过程的热力学因素控制;(组分和固定液的结构和性质) 色谱峰变宽:色谱过程的动力学因素控制;(两相中的运动阻力,扩散) 两种色谱理论:塔板理论和速率理论; 一、塔板理论-柱分离效能指标 1.塔板理论(plate theory ) 半经验理论; 将色谱分离过程比拟作蒸馏过程,将连续的色谱分离过程分割成多次的平衡过程的重复 (类似于蒸馏塔塔板上的平衡过程); 塔板理论的假设: (1) 在每一个平衡过程间隔内,平衡可以迅速达到; (2) 将载气看作成脉动(间歇)过程; (3) 试样沿色谱柱方向的扩散可忽略; (4) 每次分配的分配系数相同。 色谱柱长:L ,虚拟的塔板间距离:H ,色谱柱的理论塔板数:n , 则三者的关系为: n = L / H 理论塔板数与色谱参数之间的关系为: 保留时间包含死时间,在死时间内不参与分配! 2.有效塔板数和有效塔板高度 ?单位柱长的塔板数越多,表明柱效越高。 ?用不同物质计算可得到不同的理论塔板数。 2 22116545)()( ./b R R W t Y t n ==

?组分在t M 时间内不参与柱内分配。需引入有效塔板数和有效塔板高度: 3.塔板理论的特点和不足 (1)当色谱柱长度一定时,塔板数 n 越大(塔板高度 H 越小),被测组分在柱内被分配的次数越多,柱效能则越高,所得色谱峰越窄。 (2)不同物质在同一色谱柱上的分配系数不同,用有效塔板数和有效塔板高度作为衡量柱效能的指标时,应指明测定物质。 (3)柱效不能表示被分离组分的实际分离效果,当两组分的分配系数K 相同时,无论该色谱柱的塔板数多大,都无法分离。 (4) 塔板理论无法解释同一色谱柱在不同的载气流速下柱效不同的实验结果,也无法指出影响柱效的因素及提高柱效的途径。 二、 速率理论-影响柱效的因素 1. 速率方程(也称范弟姆特方程式) H = A + B /u + C ·u H :理论塔板高度, u :载气的线速度(cm/s) 减小A 、B 、C 三项可提高柱效; 存在着最佳流速; A 、 B 、 C 三项各与哪些因素有关 A —涡流扩散项 A = 2λdp dp :固定相的平均颗粒直径λ:固定相的填充不均匀因子 固定相颗粒越小dp ↓,填充的越均匀,A ↓,H ↓,柱效n ↑。表现在涡流扩散所引起的色谱峰变宽现象减轻,色谱峰较窄。 222/1)(16)(54.5b R R W t Y t n ==理有效 有效有效n L H W t Y t n b R R ===2'22/1')(16)(54.5

填料精馏塔理论塔板数的测定(精)

实验五 填料精馏塔理论塔板数的测定 精馏操作是分离、精制化工产品的重要操作。塔的理论塔板数决定混合物 的分离程度,因此,理论板数的实际测定是极其重要的。在实验室内由精馏装 置测取某些数据,通过计算得到该值。这种方法同样可以用于大型装置的理论 板数校核。目前包括实验室在内使用最多的是填料精馏塔。其理论板数与塔结 构、填料形状及尺寸有关。测定时要在固定结构的塔内以一定组成的混合物进 行。 一. 实验目的 1.了解实验室填料塔的结构,学会安装、测试的操作技术。 2.掌握精馏理论,了解精馏操作的影响因素,学会填料精馏塔理论板 数的测定方法 3.掌握高纯度物质的提纯制备方法。 二. 实验原理 精馏是基于汽液平衡理论的一种分离方法。对于双组分理想溶液,平衡时 气相中易挥发组分浓度要比液相中的高;气相冷凝后再次进行汽液平衡,则气 相中易挥发组分浓度又相对提高,此种操作即是平衡蒸馏。经过多次重复的平 衡蒸馏可以使两种组分分离。平衡蒸馏中每次平衡都被看作是一块理论板。精 馏塔就是由许多块理论板组成的,理论板越多,塔的分离效率就越高。板式塔 的理论板数即为该塔的板数,而填料塔的理论板数用当量高度表示。填料精馏 塔的理论板与实际板数未必一致,其中存在塔效率问题。实验室测定填料精馏 塔的理论板数是采用间歇操作,可在回流或非回流条件下进行测定。最常用的 测定方法是在全回流条件下操作,可免去加回流比、馏出速度及其它变量影响,而且试剂能反复使用。不过要在稳定条件下同时测出塔顶、塔釜组成,再由该 组成通过计算或图解法进行求解。具体方法如下: 1.计算法 二元组份在塔内具有n 块理论板的第一块板的汽液平衡关系符合平衡方 程式为: 1 11y y -=w w N m x x -+11α (1) y 1——第一块板的气相组成 x w ——塔釜液的组成 m α——全塔(包括再沸器)α(相对挥发度)的几何平均值m α=w p αα N ——理论板数

理论塔板数

理论塔板数 定义 理论塔板数(theoretical plate number),N色谱的柱效参数之一,用于定量表示色谱柱的分离效率(简称柱效)。N取决于固定相的种类、性质(粒度、粒径分布等)、填充状况、柱长、流动相的种类和流速及测定柱效所用物质的性质。如果峰形对称并符合正态分布,N可近似表示为: 理论塔板数=5.54(保留时间/半高峰宽)2 (2是平方) 柱效率用理论塔板数定量地表示:N=16*(t/w )2。其中,t是溶质从进样到最大洗脱峰出现的时间,w为该溶质的洗脱峰在基线处的宽度。在一色谱柱中用相同的洗脱条件时候,不同化合物的滞留时间与其洗脱峰宽度之比接近常数。因此理论塔板数大的色谱柱效率高。当然,N的大小和柱子长度有密切关系:理论塔板高度H=柱长/N,用H可以衡量单位长度的色谱柱的效率,H越小,则色谱柱效率越高。。。 N为常量时,W随tR成正比例变化。在一张多组分色谱图上,如果各组份含量相当,则后洗脱的峰比前面的峰要逐渐加宽,峰高则逐渐降低。 用半峰宽计算理论塔板数比用峰宽计算更为方便和常用,因为半峰宽更容易准确测定,尤其是对稍有拖尾的峰。 N与柱长成正比,柱越长,N越大。用N表示柱效时应注明柱长,,如果未注明,则表示柱长为1米时的理论塔板数。(一般HPLC柱的N在1000以上。)若用调整保留时间(tR’)计算理论塔板数,所得值称为有效理论塔板数(N有效或Neff)=16(tR’/W)2 处理方法 理论塔板数下降后可以考虑色谱柱再生 1.反相柱

分别用甲醇:水=90:10,纯甲醇(HPLC级),异丙醇(HPLC级),二氯甲烷(HPL C级)等溶剂作为流动相,依次冲洗,每种流动相流经色谱柱不少于20倍的色谱柱体积.然后再以相反的次序冲洗. 2.正相柱 分别用正己烷(HPLC级),异丙醇(HPLC级),二氯甲烷(HPLC级),甲醇(H PLC级)等溶剂做流动相,顺次冲洗,每种流动相流经色谱柱不少于20倍的柱体积(异丙醇粘度大,可降低流速,避免压力过高).注意使用溶剂的次序不要颠倒,用甲醇冲洗完后,再以相反的次序冲洗至正己烷.所有的流动相必须严格脱水. 3.离子交换柱 长时间在缓冲溶液中使用和进样,将导致色谱柱离子交换能力下降,.用稀酸缓冲溶液冲洗可以使阳离子柱再生,反之,用稀碱缓冲溶液冲洗可以使阴离子柱再生. 另外,还可以选择能溶解柱内污染物的溶剂为流动相做正方向和反方向冲洗.但再生后的色谱柱柱效是不可能恢复到新柱的水平的. 如果柱子装反了,可以调回来,但可能会造成柱内担体塌陷.在不得已的情况下尽量不要反装色谱柱. 梯度洗脱 科技名词定义 中文名称: 梯度洗脱 英文名称: gradient elution 定义: 梯度性地改变洗脱液的组分(成分、离子强度等)或pH,以期将层析柱上不同的组分洗脱出来的方法。 所属学科: 生物化学与分子生物学(一级学科) ;方法与技术(二级学科) 本内容由全国科学技术名词审定委员会审定公布 梯度洗脱(gradient elution)又称为梯度淋洗或程序洗提。 在气相色谱中,为了改善对宽沸程样品的分离和缩分析间周期,广泛采用程序升温的方法。而在液相色谱中则采用梯度洗脱的方法。在同一个分析周期中,按一定程

速率理论与塔板理论精华版

一、塔板理论 塔板理论的假设: (1) 在每一个平衡过程间隔内,平衡可以迅速达到; (2) 将载气看作成脉动(间歇)过程 (3) 试样沿色谱柱方向的扩散可忽略; (4) 每次分配的分配系数相同。 1.塔板理论(plate theory)半经验理论; 将色谱分离过程比拟作蒸馏过程,将连续的色谱分离过程分割成多次的平衡过程的重复(类似于蒸馏塔塔板上的平衡过程); 色谱柱长:L, 虚拟的塔板间距离:H 色谱柱的理论塔板数:n 则三者的关系为: n = L / H理论塔板数与色谱参数之间的关系为:保留时间包含死时间,在死时间内不参与分配 ! 2.有效塔板数和有效塔板高度 2 2 2 1 16 54 5) ( ) ( . /b R R W t Y t n= =

? 单位柱长的塔板数越多,表明柱效越高。 ? 用不同物质计算可得到不同的理论塔板数。 ? 组分在t M 时间内不参与柱内分配。需引入有效塔板数和有效塔 板高度: 3.塔板理论的特点和不足 (1)当色谱柱长度一定时,塔板数n 越大(塔板高度H 越小),被测组分在柱内被分配的次数越多,柱效能则越高,所得色谱峰越窄。 (2)不同物质在同一色谱柱上的分配系数不同,用有效塔板数和有效塔板高度作为衡量柱效能的指标时,应指明测定物质。 (3)柱效不能表示被分离组分的实际分离效果,当两组分的分配系数K 相同时,无论该色谱柱的塔板数多大,都无法分离。 (4) 塔板理论无法解释同一色谱柱在不同的载气流速下柱效不同的实验结果,也无法指出影响柱效的因素及提高柱效的途径。 二 速率理论 1956年 荷兰学者v an Deemter 等 在研究气液色谱时,提出了色谱过程动力学理论— — 速率理论。 222/1)(16)(54.5b R R W t Y t n ==理有效 有效有效n L H W t Y t n b R R ===2'22/1')(16)(54.5

理论塔板数

理论塔板数 1、定义 理论塔板数(theoretical plate number)N,色谱的柱效参数之一,用于定量表示色谱柱的分离效率(简称柱效)。N取决于固定相的种类、性质(粒度、粒径分布等)、填充状况、柱长、流动相的种类和流速及测定柱效所用物质的性质。如果峰形对称并符合正态分布,N可近似表示为:理论塔板数=5.54(保留时间/半高峰宽)2柱效率用理论塔板数定量地表示:N=16*(t/w )2。其中,t是溶质从进样到最大洗脱峰出现的时间,w为该溶质的洗脱峰在基线处的宽度。在一色谱柱中用相同的洗脱条件时候,不同化合物的滞留时间与其洗脱峰宽度之比接近常数。因此理论塔板数大的色谱柱效率高。当然,N的大小和柱子长度有密切关系:理论塔板高度H=柱长/N,用H可以衡量单位长度的色谱柱的效率,H越小,则色谱柱效率越高。 N为常量时,W随tR成正比例变化。在一张多组分色谱图上,如果各组份含量相当,则后洗脱的峰比前面的峰要逐渐加宽,峰高则逐渐降低。 用半峰宽计算理论塔板数比用峰宽计算更为方便和常用,因为半峰宽更容易准确测定,尤其是对稍有拖尾的峰。

N与柱长成正比,柱越长,N越大。用N表示柱效时应注明柱长,,如果未注明,则表示柱长为1米时的理论塔板数。(一般HPLC柱的N在1000以上。)若用调整保留时间(tR′)计算理论塔板数,所得值称为有效理论塔板数(N有效或Neff)=16(tR′/W)2 我们知道实际操作过程中,峰会出现拖尾的情况,所以,实用半峰宽比使用峰宽要准确一些,当然这也不是绝对的。 理论塔板高度和理论塔板数都是柱效指标,,由于峰宽或半峰宽是组分分子在色谱柱内离散的度量,总的离散程度是单位柱长内分子离散的累计,其与柱长成正比。 理论塔板数首先应该是和柱子的性能是有关系的,像填料,柱长什么的,和你的流动相,流速,样品分子量大小都是有关系的。每个峰的理论塔板数肯定是不同的,理论塔板数越高峰形越好。 2、理论塔板数下降后可以考虑色谱柱再生 (1)、反相柱 分别用甲醇:水=90:10,纯甲醇(HPLC级),异丙醇(HPLC级),二氯甲烷(HPLC级)等溶剂作为流动相,依次冲洗,每种流动相流经色谱柱不少于20倍的色谱柱体积,然后再以相反的次序冲洗。 (2)、正相柱 分别用正己烷(HPLC级),异丙醇(HPLC级),二氯甲烷(HPLC级),甲醇(HPLC级)等溶剂做流动相顺次冲洗,每种流动相流经色谱柱不少于20倍的柱体积(异丙醇粘度大,可降低流速,避免压力过高)。注意使用溶剂的次序不要颠倒,用甲醇冲洗完后,再以相反的次序冲洗至正己烷.所有的流动相必须严格脱水。 (3)、离子交换柱 长时间在缓冲溶液中使用和进样,将导致色谱柱离子交换能力下降,用稀酸缓冲溶液冲洗可以使阳离子柱再生,反之,用稀碱缓冲溶液冲洗可以使阴离子柱再生。 另外,还可以选择能溶解柱内污染物的溶剂为流动相做正方向和反方向冲洗,但再生后的色谱柱柱效是不可能恢复到新柱的水平的。

板式吸收塔理论塔板数的计算

板式吸收塔理论塔板数的计算 14404806 龙益如 通常在吸收操作中,大多采用填料塔。然而,填料式吸收塔不是在所有情况下均适用,仅在处理量较小,塔径在600毫米以下时(文献得知),采用填料塔比较经济。当塔径较大时,可能出现严重的壁流和沟流现象,导致吸收效率下降。故,处理量较大时,采用板式吸收塔。另外,填料塔不能像板式塔一样设置人孔进行检修和清洗,故此方面依旧板式塔更优。 下面进行板式吸收塔的理论塔板数的计算,主要参照板式精馏塔采用逐级计算法和图解法,另外由查阅文献介绍解析法等其他方法。 方法一: 首先,我们假定板式吸收塔中每一块塔板均为理想板,即塔板上的液相组成是均匀的,且离开该板的气液两相处于平衡状态,即所谓理论板。同时,在气相中采用惰性组分的摩尔比为基准,在液相中采用吸收剂的摩尔比为基准,且满足吸收过程中惰性组分吸收剂的流量均可视为恒定,即各板上升的惰性组分的摩尔流量V均相等,各板下降的吸收剂的摩尔流量L均相等。基于以上讨论,参照板式精馏塔的处理方式,进行计算: 如图所示,在全塔范围内对溶质进行物料衡算得 V Y b+LX a=VY a+LX b(1-1) V Y b?Y a=L(X b?X a)(1-2)

在吸收塔的任意两板间(i 和i+1)分别与塔顶 或者塔底的范围内,对溶质A 进行物料衡算得 V Y i +1+LX a =VY a +LX i 移项,得 Y i +1=L V X i +(Y a ?L V X a )(1-3)即为板式吸收塔的操作线方程。 由以上部分计算对比教材上填料式吸收塔的计算可 知,此部分两者的处理方法基本相同。故,后续部 分计算直接采用书上已有公式。 其中,Y a =Y b (1?φA ) (1-4) 而最小液气比 (L V )min =Y b ?Y a Y b m ?X a (1-5) 又实际液气比为 L V =(1.1~1.2)(L V )min (1-6) 图1-1 一般情况下,进行吸收操作时,处理量V 、进塔气体组成Y b 、出塔气体组成Y a 以及进塔吸收剂组成X a 均为设计时已经确定的量,故式1-2、1-5、1-6可求得出塔吸收液组成X b 。 从塔顶开始进行逐板计算: 由平衡线方程 Y =mX (1-7) X 1=Y a m 由操作线方程: Y 2=L V X 1+(Y a ?L V X a ) 由平衡线方程: X 2=Y 2m

理论塔板计算

理论塔板计算

第五节精馏过程的物料衡算和塔板数的计算日期:2008-4-5 3:29:24 来源:来自网络查看:[大中小] 作者:不详热度: 505 一、理论塔板 连续精馏计算的主要对象是精馏塔的理论塔板数。所谓的理论塔板是指气液在塔板上充分接触,有足够长的时间进行传热传质,当气体离开塔板上升时与离开塔板下降的液体已达平衡,这样的塔板称为理论塔板。实际上,由于塔板上气液接触的时间及面积均有限,因而任何形式的塔板上气液两相都难以达到平衡状态,也就是说理论塔板是不存在的,它仅是一种理想的板,是用来衡量实际分离效率的依据和标准。通常在设计中先求出按生产要求所需的理论塔板数N T然后用塔板效率η予以校正,即可求得精馏设备中的实际塔板数N P 二、计算的前提 由于精馏过程是涉及传热、传质的复杂过程,影响因素众多。为处理问题的方便作如下假设,这些就是计算的前提条件。 (1)塔身对外界是绝热的,即没有热损失。 (2)回流液由塔顶全凝器供给,其组成与塔顶产品相同。 (3)塔内上升蒸气由再沸器加热馏残液使之部分气化送入塔内而得到。 (4)恒摩尔气化在精馏操作时,在精馏段内,每层塔板上升的蒸气的摩尔流量都是相等的,提馏段内也是如此,即: 精馏段:V1 = V2 = …………=Vn= Vmol/s(下标为塔板序号,下同) 提馏段:V′n+1 =V′n+2 =…………=V′m= V′mol/s 但Vn不一定与V′m相等,这取决于进料状态。 (5)恒摩尔溢流(或称为恒摩尔冷凝)精馏操作时,在精馏段内每层塔板下降的液体的摩尔流量都是相等的,提馏段也是如此, 即:L1 = L2=…………= L n = L mol/s L′n+1= L′n+2=………… = L′m= L′ mol/s 但L不一定与L′相等,这也取决于进料的状态。 (6)塔内各塔板均为理论塔板。 三、物料衡算和操作线方程 1、全塔物料衡算

理论塔板数

理论塔板数 色谱的柱效参数之一,用于定量表示色谱柱的分离效率(简称柱效)。 N与柱长成正比,柱越长,N越大。用N表示柱效时应注明柱长,,如果未注明,则表示柱长为1米时的理论塔板数。(一般HPLC柱的N在1000以上。) 若用调整保留时间(tR’)计算理论塔板数,所得值称为有效理论塔板数(N有效或Neff)=16(tR’/W)2 谱线红移 对于宇宙谱线红移,从可能性的角度可能存在三中形成谱线频移的原因,即:距离效应、多普勒效应、康普顿效应,本文从理论上提出鉴别那一种是形成主要原因的方法。 不饱和度 不饱和度又称缺氢指数,即有机物分子中与碳原子数相等的开链烷烃相比较,每减少2个氢原子,则有机物的不饱和度增加1,用Ω表示。 气相色谱法(gas chromatography 简称GC)是色谱法的一种。色谱法中有两个相,一个相是流动相,另一个相是固定相。如果用液体作流动相,就叫液相色谱,用气体作流动相,就叫气相色谱。 气相色谱法由于所用的固定相不同,可以分为两种,用固体吸附剂作固定相的叫气固色谱,用涂有固定液的担体作固定相的叫气液色谱。 按色谱分离原理来分,气相色谱法亦可分为吸附色谱和分配色谱两类,在气固色谱中,固定相为吸附剂,气固色谱属于吸附色谱,气液色谱属于分配色谱。 液相色谱法 liquid chromatography 用液体作为流动相的色谱法。1903 年俄国化学家M.C.茨维特首先将液相色谱法用于分离叶绿素。 原理和分类液相色谱法的分离机理是基于混合物中各组分对两相亲和力的差别。根据固定相的不同,液相色谱分为液固色谱、液液色谱和键合相色谱。应用最广的是以硅胶为填料的液固色谱和以微硅胶为基质的键合相色谱。根据固定相的形式,液相色谱法可以分为柱色谱法、纸色谱法及薄层色谱法。按吸附力可分为吸附色谱、分配色谱、离子交换色谱和凝胶渗透色谱。近年来,在液相柱色谱系统中加上高压液流系统,使流动相在高压下快速流动,以提高分离效果,因此出现了高效(又称高压)液相色谱法。样品中各组分在两相中分配系数的差异。 中文词条名:火焰离子化检测器(FID) 英文词条名: 有机物在氢火焰中燃烧时生成的离子,在电场作用下产生电信号的器件。 死时间 死体积(dead Volume),从进样到惰性气体峰出现极大值的时间称为死时间. 所谓惰气指的是与色谱固定相无相互作用的组分,也就是说它能与进样瞬间的载

理论塔板计算

第五节精馏过程的物料衡算和塔板数的计算日期:2008-4-5 3:29:24 来源:来自网络查看:[大中小] 作者:不详热度: 505 一、理论塔板 连续精馏计算的主要对象是精馏塔的理论塔板数。所谓的理论塔板是指气液在塔板上充分接触,有足够长的时间进行传热传质,当气体离开塔板上升时与离开塔板下降的液体已达平衡,这样的塔板称为理论塔板。实际上,由于塔板上气液接触的时间及面积均有限,因而任何形式的塔板上气液两相都难以达到平衡状态,也就是说理论塔板是不存在的,它仅是一种理想的板,是用来衡量实际分离效率的依据和标准。通常在设计中先求出按生产要求所需的理论塔板数N T然后用塔板效率η予以校正,即可求得精馏设备中的实际塔板数N P 二、计算的前提 由于精馏过程是涉及传热、传质的复杂过程,影响因素众多。为处理问题的方便作如下假设,这些就是计算的前提条件。 (1)塔身对外界是绝热的,即没有热损失。 (2)回流液由塔顶全凝器供给,其组成与塔顶产品相同。 (3)塔内上升蒸气由再沸器加热馏残液使之部分气化送入塔内而得到。 (4)恒摩尔气化在精馏操作时,在精馏段内,每层塔板上升的蒸气的摩尔流量都是相等的,提馏段内也是如此,即: 精馏段:V1 = V2 = …………=Vn= Vmol/s(下标为塔板序号,下同) 提馏段:V′n+1 =V′n+2 =…………=V′m= V′mol/s 但Vn不一定与V′m相等,这取决于进料状态。 (5)恒摩尔溢流(或称为恒摩尔冷凝)精馏操作时,在精馏段内每层塔板下降的液体的摩尔流量都是相等的,提馏段也是如此, 即:L1 = L2=…………= L n = L mol/s L′n+1= L′n+2=………… = L′m= L′ mol/s 但L不一定与L′相等,这也取决于进料的状态。 (6)塔内各塔板均为理论塔板。 三、物料衡算和操作线方程 1、全塔物料衡算

化工原理理论塔板计算

精馏过程的物料衡算和塔板数的计算 一、理论塔板 连续精馏计算的主要对象是精馏塔的理论塔板数。所谓的理论塔板是指气液在塔板上充分接触,有足够长的时间进行传热传质,当气体离开塔板上升时与离开塔板下降的液体已达平衡,这样的塔板称为理论塔板。实际上,由于塔板上气液接触的时间及面积均有限,因而任何形式的塔板上气液两相都难以达到平衡状态,也就是说理论塔板是不存在的,它仅是一种理想的板,是用来衡量实际分离效率的依据和标准。通常在设计中先求出按生产要求所需的理论塔板数N T然后用塔板效率η予以校正,即可求得精馏设备中的实际塔板数N P 二、计算的前提 由于精馏过程是涉及传热、传质的复杂过程,影响因素众多。为处理问题的方便作如下假设,这些就是计算的前提条件。 (1)塔身对外界是绝热的,即没有热损失。 (2)回流液由塔顶全凝器供给,其组成与塔顶产品相同。 (3)塔内上升蒸气由再沸器加热馏残液使之部分气化送入塔内而得到。 (4)恒摩尔气化在精馏操作时,在精馏段内,每层塔板上升的蒸气的摩尔流量都是相等的,提馏段内也是如此,即: 精馏段:V1 = V2 = …………=Vn= Vmol/s(下标为塔板序号,下同) 提馏段:V′n+1 =V′n+2 =…………=V′m= V′mol/s 但Vn不一定与V′m相等,这取决于进料状态。 (5)恒摩尔溢流(或称为恒摩尔冷凝)精馏操作时,在精馏段内每层塔板下降的液体的摩尔流量都是相等的,提馏段也是如此, 即:L1 = L2=…………= L n = L mol/s L′n+1= L′n+2=………… = L′m= L′ mol/s 但L不一定与L′相等,这也取决于进料的状态。 (6)塔内各塔板均为理论塔板。 三、物料衡算和操作线方程 1、全塔物料衡算

化工原理理论塔板数求解示例

示例 苯(A )~氯仿(B )二组分体系在 下的气~液平衡数据 t( ℃ ) 80.2 79.9 79 78.1 77.2 76 74.6 72.8 70.5 67 61 汽相y 2 0.0000 0.0932 0.1961 0.3085 0.4240 0.5480 0.6620 0.7612 0.8545 0.9415 1.0000 液相x 2 0.0000 0.0676 0.1403 0.2186 0.3032 0.3949 0.4947 0.6036 0.7231 0.8545 1.0000 由以上数据画气液平衡线 3.1理论板数计算 3.1.1物料衡算 已知进料量F =240kmol/h ,进料组成X F =0.4,进料q =0.5 设计要求:X D =0.995,Xw=0.002 衡算方程 : ???==????+=?+=???????+=+=h KMol W h KMol D W D W D WX DX FX W D F W D F /81.143/19.96002.0995.04.0240240 3.1.2 q 线方程 X F =0.4 q =0.5?q 线方程为:y=-x+0.8

(Xe,Ye ) 01 1 y 0.33380.4662 汽液平衡线 由q 线和平衡线交点确定Xe=0.3338,Ye=0.4662 3.1.3 R min 和R 的确定 9939.33338.04662.04662.0995.0e e e min =--=--= X Y Y X R D R=1.6R min =1.6*3.9939=6.3903 3.1.4精馏段操作线方程的确定 精馏段操作线方程: 13464.08647.03903 .7995.03903.73903.611n n n 1n +=+=+++=+X X R X X R R Y D 3.1.5精馏段和提馏段气液流量的确定 已知 D =96.19kmol/h R =6.3903

相关文档
最新文档