Skynet

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

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

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

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

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


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

            2. 數據結構預開空間 100 byte
            3. 文件存儲在描述 : # 鏈表排序我就不介紹了,數據結構的最基本技能,修改數據結構中的比自己小的指向
                我這就給出結果
          { /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...
                 根據 鏈表中 200 到 seek 56 76 取出 ..b...
                 等等

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


          通過說明,我這 給大家提供個 可能需要的 技術細節 (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 包,這樣序列出來的數據到文件中其他語言也可以使用
           參考: http://www.pythonid.com/bbs/archiver/?tid-285.html
          pack1.py
          from struct import *

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

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


          上面的代碼往C的結構中寫入數據,結構包括兩個整型和一個字符串。
          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



             
          最后羅嗦下:
            能用數據結構了,很多東西都可以根據自己邏輯定制 存儲很方便 。 不再受 關系數據庫 , key 數據庫 或 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 劉凱毅 閱讀(2113) 評論(0)  編輯  收藏 所屬分類: python數據挖掘
          主站蜘蛛池模板: 金川县| 永城市| 星子县| 甘南县| 昆山市| 兴仁县| 阜平县| 永仁县| 西和县| 汝城县| 仙桃市| 屏南县| 赤峰市| 仲巴县| 仙游县| 五峰| 烟台市| 板桥市| 邓州市| 闻喜县| 旺苍县| 辽源市| 金门县| 兴山县| 增城市| 三原县| 贵南县| 娱乐| 宜兰市| 玉门市| 平陆县| 福海县| 佛坪县| 保山市| 杂多县| 武陟县| 仪征市| 都兰县| 石门县| 道真| 衡东县|