虽然 mysql,oracle 和 Berkeley DB,sqlite3 等数据库已经很好
但是当我初略学习下 数据挖掘方面的一些知识发现,关系数据库远远不够来存储,查询 etl 后的数据
比如:我希望原始日志数据进行某一字段的排序,是不是很简单 。
有人说 - 数据导入数据库 load into table ... , select order by 。之
还有人说 - linux sort -n...
恩!很好,下面我们对大小为 1TB 的数据开始进行这个简单的操作 -- 傻眼了 !!
关于挖掘 - TB 级别的数量在我目前学习挖掘不到半年,就遇到过3-4次之多
解决办法:
对于这个问题 - 我现在希望能有个 大的链表 - (大到内存装不下) ,
链表中的struct 结构为 :
>> 排序属性文件归属
>> 排序属性整条数据在文件中的 起始位置 - 结束位置
>> 在排序中的排位 ( 链表结构,只记入比自己小的 属性在此链表的位置 )
比如 :
1. 文件1内容 =>
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. 二进制文件 结构化 写,修改
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
但是当我初略学习下 数据挖掘方面的一些知识发现,关系数据库远远不够来存储,查询 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
完整数据描述 : 此数据在文件中的 起始位置(当然是通过程序取得的,这为了方便我标出)
..c. 0 - 22
..a. 23 - 55
..b. 56 - 76
..d. 77 - 130
..f. 131 - 220
..e. 221 - 243
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 )
2. seek 指定位置结构化读取
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 )
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
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
本文转自博客园刘凯毅的博客,原文链接:文件存储 - 数据结构( py ),如需转载请自行联系原博主。