雖然 mysql,oracle 和 Berkeley DB,sqlite3 等數據庫已經很好
但是當我初略學習下 數據挖掘方面的一些知識發現,關系數據庫遠遠不夠來存儲,查詢 etl 后的數據
比如:我希望原始日志數據進行某一字段的排序,是不是很簡單 。
有人說 - 數據導入數據庫 load into table ... , select order by 。之
還有人說 - linux sort -n...
恩!很好,下面我們對大小為 1TB 的數據開始進行這個簡單的操作 -- 傻眼了 !!
關于挖掘 - TB 級別的數量在我目前學習挖掘不到半年,就遇到過3-4次之多
解決辦法:
對于這個問題 - 我現在希望能有個 大的鏈表 - (大到內存裝不下),
鏈表中的struct 結構為 :
>> 排序屬性文件歸屬
>> 排序屬性整條數據在文件中的 起始位置 - 結束位置
>> 在排序中的排位 ( 鏈表結構,只記入比自己小的 屬性在此鏈表的位置 )
比如 :
1. 文件1內容 =>
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. 二進制文件 結構化 寫,修改
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
最后羅嗦下:
能用數據結構了,很多東西都可以根據自己邏輯定制 存儲很方便 。 不再受 關系數據庫 , 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
但是當我初略學習下 數據挖掘方面的一些知識發現,關系數據庫遠遠不夠來存儲,查詢 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
完整數據描述 : 此數據在文件中的 起始位置(當然是通過程序取得的,這為了方便我標出)
..c

..a

..b

..d

..f

..e

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', 3, 4, 'google')
os.lseek(fs, len(ss)*10, 0)
os.write(fs,ss)
os.fsync(fs)
#os.close( fs )
import os
from struct import *
fd = os.open( "pack1.txt", os.O_RDWR|os.O_CREAT )
ss = pack('ii11s', 3, 4, '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', 1, 2, 'hello world')
f = 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
from struct import *
# i 為 int(4) 11s 為預留 11 位置 的 string
# 此數據類型 為 19 byte ss = pack('ii11s', 1, 2, 'hello world')
f = 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