`
cuizhenfu#gmail.com
  • 浏览: 67559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

转载一篇讲jxta net.jxta.impl.xindice包的

阅读更多
From:http://delphi.ktop.com.tw/board.php?cid=169&fid=963&tid=57037

BTree一直是我心中的惡夢,依稀還記得我大二上的時候,修了一門叫「
檔案結構」的課,依稀有教到這個東西。這門課最後以9分收場,不僅造
成了終生的遺憾,也讓我自此對資料庫相關的課程,望之卻步,差點成為
我軟體技術上的罩門,一直等到在獨孤木先生英明偉大的領導下,才漸漸
明白和關聯式資料庫有關的一些東西,也終於會寫一點點粗淺的SQL。

很多時候,命運會為你和你不愛的東西搭起一座橋(請參考「我的野蠻女
友」)。在前些日子,我就剛好遇到一個需要BTree才能解的問題。事情
是這樣子的:我需要一種資料結構,要能夠很快的判斷出來某個key值是
否已經存在,當某key值已經存在的時候,要能夠快速的找到這個key值
所對應的value。當然,我會需要把某個key:value的對應塞到這個資料
結構中,也會需要把某個key值和它所對應的value一起從這個資料結構
中移除。

沒有什麼意外的話,我會利用Java的java.util.HashMap來達到這個目的。
當資料都只需要在記憶體中處理的話,當然滿理想的。可偏偏資料量極大
,而且即使程式終止後都必須保留住其內容-也就是persistent的意思。
這下就有點頭疼了,做HashMap的object serialization可不理想呢。這
時9分,即使是9分都可以派上用場,腦中靠著這9分硬是把BTree給召喚
了出來。嗯,我可能需要的是BTree。

因為只有9分的實力,所以還是來看看BTree抽象的外觀、把它當黑盒子看
就好了。BTree支援搜尋(serach)、建立(create)、插入(insert)、
刪除(delete)等operation。從名字上看,可以很容易明白它和
red-black tree、AVL tree一樣都是balanced tree。也就是說,它們會
盡可能的保持樹狀結構本身的高度(height)平衡,使得高度始終能和樹
中節點個數保持對數的關係,也就是log(n)的意思。高度平衡可以得到什
麼好處?當高度不會因為樹本身的節點成長而成長的太快時,意謂著即使
資料量成長到很大,我們在這種資料結構中操作資料,其時間複雜度都不
會太高。

但是,我們要的不只是一種平衡的樹,因為我們需要把資料儲存在具永續
性的儲存媒體上,也就是檔案,所以需要的是一種可以有效在磁碟上處理
的檔案結構,起碼要能夠以主記憶體RAM為主,以磁碟為輔。而BTree正是
一種基於此種目的而被發展出來的資料結構,它可以將部份或全部的資料
維護於磁碟中,並且最小化讀取磁碟的數目-因為讀取磁碟的代價實在太
昂貴了。

憑著9分的實力,從古老沉睡中的記憶喚配了BTree。接下來,我的問題就
是找到一個版權合理,而且符合我需求:Java、open source的實作品了。
這時候腦中浮起另一個印象,有一個P2P的open source計畫-JXTA,它內
部用來索引其文件的機制xindice,似乎就有一個BTree的實作品。經過一
陣翻箱倒櫃,證實我的記憶沒錯,而且看起來xindice和JXTA其他部份的相
依性還很低,可以很容易將它取出,而不必使用到JXTA的其他部份。如果
有興趣的話,可以接下去看看我是怎麼做的。

首先,下載JXTA的source code,找到net.jxta.impl.xindice下所有的東
西,包括core與util兩個sub-package,把它們拿出來獨立編譯,就可以得
到它的xindice的部份。很神奇,完全沒有和任何JXTA其他的程式相依,
所以我相信這也是從其他地方抄來的。

這樣其實就會動了。我們可以看一下下面的範例程式:

import net.jxta.impl.xindice.core.data.Key;
import net.jxta.impl.xindice.core.data.Value;
import net.jxta.impl.xindice.core.data.Record;
import net.jxta.impl.xindice.core.filer.BTreeFiler;

public class BTreeExample
{
public static void main(String[] args)
{
try
{
BTreeFiler mapping = new BTreeFiler();
boolean sync = true;
mapping.setSync(sync);
mapping.setLocation(".", "mapping");
if (!mapping.open())
{
mapping.create();
mapping.open();
}
System.out.println(System.currentTimeMillis());
for(int i=0;i<100;i++)
{
char ch = (char) ('A'+(i%26));
String key = ""+ch+i;
Key dbKey = new Key(key);
String value = Integer.toString(i);
Value recordValue = new Value(value.getBytes());
mapping.writeRecord(dbKey, recordValue);
}
System.out.println(System.currentTimeMillis());
Key dbKey = new Key("X23");
Record record = mapping.readRecord(dbKey);
Value v = record.getValue();
byte b[] = v.getData();
System.out.println(new String(b));
System.out.println(System.currentTimeMillis());
//
mapping.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

整個BTree的檔案,需要利用BTreeFiler這個物件來建立,當你呼叫其
setLocaiton()方法時,即在指定其檔案儲存的路徑以及檔案名稱。在這
個例子中,指定儲存在目前的工作目錄(.),主檔名為mapping,副檔
案則會由xindice指定為.tbl。要使用BTree檔,得先開啟
(BTreeFiler.open()),倘若檔案不存在時,得加以建立
(BTreeFiler.create())。若想將一筆資料塞到BTree檔案中時,可以
使用BTreeFiler. writeRecord()方法。但在呼叫之前,得先建立Key與
Value的物件,藉以表示想要塞到BTree之資料的key及value值。Xindice
的value值,可以是byte陣列,所以你可以儲存任何可以轉換成byte陣列
的資料,例如String可以直接呼叫getBytes()取得,而其他的物件也可
以利用object serialization取得。接著,如果想要對BTree進行搜尋,
只要呼叫BTreeFiler. readRecord()方法,只需以Key的object來指定其
key值即可。當若在BTree中尋得資料,便會回傳型別為Value的物件,反
之則回傳null。Value物件中儲存的,即是BTree中符合你所指定key值之
資料的值本身。相關的API細節,可以查看JXTA的javadoc文件,在此不
再贅述。

我有在範例程式中加上了timestamp,大概估量了一下時間,搜尋的速度
極快。

雖然沒有花力氣找其他的實作品,也許網路上還有更好的實作品,不過
目前的這個xindice已經挺夠用的。像我這樣的懶人是不會精益求精的。
像本文所提到的問題,如果用RDBMS解,當然可以,但是太heavy了,有
牛刀之嫌,對某些需要身子瘦一點的用戶端應用程式來說,用RDBMS是不
太適用的。

這件事情另外給我們一個教訓就是,即使是9分都有9分的價值,有上課
就有保祐,雖然總共只上了幾堂課。最後還告訴我們一件事情,
open source的計畫中有時藏著珍寶,沒事晃晃都會有收獲。

(全文完)
分享到:
评论

相关推荐

    JXTA JXTA.jar

    jxta.jar p2p jxta.jar p2p jxta.jar p2p

    jxta-myjxta-2.5.zip_file sharing in chat_jxta 2.5 例子_jxta2.5.jar

    JXTA(Java eXtensible Networking Architecture)是Sun Microsystems开发的一种开放的P2P(peer-to-peer)平台框架,它提供了一组协议和服务,使得设备之间可以直接进行通信和协作。myJXTA是JXTA的一个简化版,更...

    jxta2.7.zip

    JXTA(Java eXtensible Peer-to-Peer Technology Platform)是Oracle公司开发的一个开源、跨平台的P2P(Peer-to-Peer)框架,它为构建基于对等网络的应用程序提供了一组标准协议和API。JXTA 2.7是这个框架的一个版本...

    jxta-shell-2.4.zip

    JXTA Shell是这个平台的一个重要组成部分,它为开发者和管理员提供了一个交互式的命令行界面,以便于探索、配置和管理JXTA网络。"jxta-shell-2.4.zip"文件包含了JXTA Shell的2.4版本,这是对JXTA Shell的一个重要...

    jxta.rar_jxta_jxta cms

    总结来说,"jxta.rar_jxta_jxta cms"这个压缩包中的三个关键组件——"jxta.jar"、"cms.jar"和"jdom.jar",为构建基于JXTA的P2P系统提供了必要的工具和库。它们共同构建了一个强大且安全的P2P环境,使得开发者能够...

    net.rar_jxta net

    JXTA是一个开放源码的P2P(peer-to-peer)平台,由Sun Microsystems开发,它允许设备之间进行对等通信,共享资源和服务。描述中的“jxta sample program source code”进一步确认了这一点,表明这个压缩包中包含的是...

    jxta.rar_jxta

    总结,"jxta.rar_jxta"这个压缩包可能是一个学习JXTA P2P编程的资源,其中的"HelloWorld"实例将引导用户熟悉JXTA的基本概念和操作流程,涉及JXTA的初始化、服务广告、发现、连接建立以及数据交换等核心功能。...

    activemq-transport-jxta-2.0.jar.zip

    标题中的"activemq-transport-jxta-2.0.jar.zip"是一个压缩包文件,主要包含两个元素:activemq-transport-jxta-2.0.jar 和 license.txt。这个压缩包涉及到的技术点主要是Apache ActiveMQ、JXTA(Java eXtensible ...

    JXTA.rar_jxta

    **JXTA(Java XML-based Peer-to-Peer Toolkit)** 是一种开源的、基于Java的、XML驱动的对等网络工具包,它提供了一套框架和API,用于构建分布式对等应用程序。JXTA的核心理念是让计算设备,无论大小、类型或操作...

    activemq-transport-jxta-1.5.jar.zip

    JXTA是一个由Sun Microsystems开发的P2P平台,旨在提供一种标准的、分散的、无需中心服务器的网络通信框架。通过JXTA,节点可以直接通信,实现资源的共享和交换,这与ActiveMQ的消息传递理念相吻合。 ActiveMQ的...

    activemq-transport-jxta-2.1.jar.zip

    JXTA是Sun Microsystems开发的一种P2P(对等网络)技术,它允许网络中的设备直接相互通信,无需中心服务器。在ActiveMQ中集成JXTA,使得消息传递可以跨越传统客户端-服务器架构,实现更灵活、去中心化的通信模式。...

    jxta运行的所有jar包

    /files/JXTA_Demo/lib/jxta.jar /files/JXTA_Demo/lib/beepcore.jar /files/JXTA_Demo/lib/cryptix-asn1.jar /files/JXTA_Demo/lib/cryptix32.jar /files/JXTA_Demo/lib/jxtaptls.jar /files/JXTA_Demo/lib/...

    JXTA开发包1

    这个开发包源自官方站点 **jxta.org** ,并经过了安全检查,确保无病毒,为开发者提供了安全可靠的开发环境。P2P技术是一种分布式计算模型,允许网络中的每个节点既是客户端也是服务器,共享资源和服务。 JXTA...

    jxta.rar_open

    "jxta.rar_open"的标题暗示了我们将深入探讨如何打开和利用这个压缩包中的资源,特别是"jxta.pdf"文件,它可能包含了关于JXTA项目的基本介绍和最新更新。 JXTA的核心概念包括: 1. **边缘计算**:在P2P网络中,每...

    activemq-transport-jxta-1.2.jar.zip

    《ActiveMQ 与 JXTA 传输协议:深入解析 activemq-transport-jxta-1.2.jar》 在IT行业中,消息中间件扮演着至关重要的角色,它能够有效地解决分布式系统之间的通信问题。Apache ActiveMQ是其中的一款知名开源消息...

    JXTA.rar_beepcore java_jxta_jxta jar_jxta xchat_p2psocket jxta

    **JXTA(Java XTREME Protocol Architecture)**是一个开源的、基于 peer-to-peer (P2P) 技术的框架,由Sun Microsystems在2001年推出。它的目标是提供一种允许分布式应用程序在互联网上进行通信和协作的平台。JXTA...

    activemq-transport-jxta-1.4.jar.zip

    在众多的传输协议中,JXTA(JavaXTA Peer-to-Peer Toolkit)是一种特殊的存在,它为分布式计算环境提供了P2P通信的能力。本文将围绕"activemq-transport-jxta-1.4.jar.zip"这个压缩包文件,深入探讨ActiveMQ中的JXTA...

    jxta-shell-src-2.3.4.rar_JXTA Shell 2.5_r_java shell_jxta_jxta s

    JXTA Shell在启动时会读取配置文件,如`jxta.properties`,来设置网络参数,如端口、身份证书等。源码中包含了如何加载和解析这些配置的细节,这对于理解JXTA网络的初始化过程非常有帮助。 6. 故障排查与调试 ...

    jxta-src-2.4.1.zip_JXTA2.4.1_MyJXTA2.4_jxta_jxta-lib-2.4.1.zip_j

    描述中提到的"含有源代码、所需要的其他的开发包等",意味着这个压缩包不仅包含了JXTA的核心源代码,还可能包括了必要的依赖库和其他开发工具,这对于开发者来说是一份非常完整的开发资源。"myjxta2.4"可能是指...

    activemq-transport-jxta-1.3.jar.zip

    标题中的"activemq-transport-jxta-1.3.jar.zip"是一个压缩文件,它包含的是Apache ActiveMQ的一个特定版本——1.3版的JXTA(Java XML Transport)传输模块。ActiveMQ是业界广泛使用的开源消息代理,它遵循开放消息...

Global site tag (gtag.js) - Google Analytics