Skynet

          ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks
          雖然 mysql,oracle 和  Berkeley DB,sqlite3 等數(shù)據(jù)庫已經(jīng)很好
           但是當我初略學習下 數(shù)據(jù)挖掘方面的一些知識發(fā)現(xiàn),關系數(shù)據(jù)庫遠遠不夠來存儲,查詢 etl 后的數(shù)據(jù)

          比如:我希望原始日志數(shù)據(jù)進行某一字段的排序,是不是很簡單 。
            有人說  - 數(shù)據(jù)導入數(shù)據(jù)庫 load into table ... , select order by 。之
            還有人說 - linux sort -n...

          恩!很好,下面我們對大小為 1TB 的數(shù)據(jù)開始進行這個簡單的操作   -- 傻眼了 !!
             關于挖掘 - TB 級別的數(shù)量在我目前學習挖掘不到半年,就遇到過3-4次之多

          解決辦法:
          對于這個問題 - 我現(xiàn)在希望能有個 大的鏈表 - (大到內存裝不下)
            鏈表中的struct 結構為 :
             >> 排序屬性文件歸屬
             >> 排序屬性整條數(shù)據(jù)在文件中的 起始位置 - 結束位置
             >> 在排序中的排位 ( 鏈表結構,只記入比自己小的 屬性在此鏈表的位置  )


          比如 :
            1. 文件1內容 =>
          說明:
          完整數(shù)據(jù)描述 : 此數(shù)據(jù)在文件中的 起始位置(當然是通過程序取得的,這為了方便我標出)
          ..c.  0 
          - 22
          ..a.  
          23 - 55
          ..b.  
          56- 76
          ..d.  
          77 - 130
          ..f.  
          131 - 220
          ..e.  
          221 - 243

            2. 數(shù)據(jù)結構預開空間 100 byte
            3. 文件存儲在描述 : # 鏈表排序我就不介紹了,數(shù)據(jù)結構的最基本技能,修改數(shù)據(jù)結構中的比自己小的指向
                我這就給出結果
          { /tmp/文件1, 0-22 ,  300 }   #說明 c : 在鏈表位置 0
          { /tmp/文件1, 23-55 , 200 }       # a : 100
          { /tmp/文件1, 56-76 , 0 }     # b : 200
          { /tmp/文件1, 77-130 , 500 }  # d : 300
          { /tmp/文件1, 131-220 ,  } # f : 400
          { /tmp/文件1, 221-243 , 400 } # e : 500

          4. 倒敘輸出 由小到到
               假設預存最小 為  200 鏈表位置
               找出 使用 open /tmp/文件1 
                 并使用 seek 文件游標 定位  23-55 取出  ..a...
                 根據(jù) 鏈表中 200 到 seek 56 76 取出 ..b...
                 等等

          當然 上面
            數(shù)據(jù)結構你可以使用 雙向鏈表, btree , 紅黑 , 斐波那契。。。( 數(shù)據(jù)結構終于感覺有用了,不枉費我考的軟證啊!)


          通過說明,我這 給大家提供個 可能需要的 技術細節(jié) (py),不足之處 歡迎拍磚!!

          1. 二進制文件 結構化 寫,修改
          #指定修改 190 byte 處的 內容
          import os
          from struct import *
          fd 
          = os.open( "pack1.txt", os.O_RDWR|os.O_CREAT )

          ss 
          = pack('ii11s'34'google')
          os.lseek(fs, len(ss)
          *10, 0) 
          os.write(fs,ss) 
          os.fsync(fs)

          #os.close( fs )



          2. seek 指定位置結構化讀取


          from struct import *
          file_object 
          = open('pack1.txt''rb')

          def ts(si,ss=len(ss)):
              file_object.seek(si
          *ss)
              chunk 
          = file_object.read(ss)
              a,b,c
          =unpack('ii11s', chunk )
              
          print a,b,c

          ts(10)
          #輸出 
          3 4 google





          1. 其他語言的 使用
          struct 結構定義 ,在 python 中 使用  struct 包,這樣序列出來的數(shù)據(jù)到文件中其他語言也可以使用
           參考: http://www.pythonid.com/bbs/archiver/?tid-285.html
          pack1.py
          from struct import *

          # i 為 int(4)  11s 為預留 11 位置 的 string
          # 此數(shù)據(jù)類型 為 19 byte ss 
          = pack('ii11s'12'hello world')

          = open("pack1.txt""wb")
          f.write(ss)
          f.close()


          上面的代碼往C的結構中寫入數(shù)據(jù),結構包括兩個整型和一個字符串。
          pack1.c
          #include <stdio.h>
          #
          include <string.h>

          struct AA
          {
              int a;
              int b;
              char    c[
          64];
          };

          int main()
          {
              struct AA   aa;
              FILE    
          *fp;
              int     size, readsize;
                
              memset(
          &aa, 0, sizeof(struct AA));
             
              fp 
          = fopen("pack1.txt""rb");
              
          if (NULL == fp) {
                  printf(
          "open file error!"n");
                  
          return 0;
              }
             
              readsize 
          = sizeof(struct AA);
              printf(
          "readsize: %d"n", readsize);
            
              size 
          = fread(&aa, 1, readsize, fp);   
              printf(
          "read: %d"n", size);
              printf(
          "a=%d, b=%d, c=%s"n", aa.a, aa.b, aa.c);
             
              fclose(fp);
             
              
          return 0;
          }

          結果輸出:
          C:"Documents and Settings"lky"桌面"dataStructure>a
          readsize: 72
          read: 57
          a=1, b=2, c=hello word



             
          最后羅嗦下:
            能用數(shù)據(jù)結構了,很多東西都可以根據(jù)自己邏輯定制 存儲很方便 。 不再受 關系數(shù)據(jù)庫 , key 數(shù)據(jù)庫 或 mapreduce 的限制
            
          參考:
          http://docs.python.org/library/struct.html#module-struct    #官方struct 包 說明
          http://blog.csdn.net/JGood/archive/2009/06/22/4290158.aspx  # 使用 struct  的前輩留下的
          http://www.tutorialspoint.com/python/os_lseek.htm #一個小demo
          Python天天美味(17) - open讀寫文件










          整理 www.aygfsteel.com/Good-Game
          posted on 2009-11-04 15:16 劉凱毅 閱讀(2118) 評論(0)  編輯  收藏 所屬分類: python數(shù)據(jù)挖掘
          主站蜘蛛池模板: 梧州市| 德兴市| 沂水县| 常州市| 壶关县| 香格里拉县| 西乌珠穆沁旗| 吉水县| 磐石市| 昌吉市| 永济市| 南昌市| 龙口市| 宝兴县| 独山县| 遂宁市| 满城县| 宣武区| 玛纳斯县| 西平县| 公主岭市| 宝山区| 台南市| 奎屯市| 新田县| 枣阳市| 徐水县| 大新县| 土默特左旗| 无为县| 德钦县| 张家港市| 尖扎县| 齐河县| 元阳县| 藁城市| 江西省| 美姑县| 阿克陶县| 长泰县| 潮州市|