有关多文件操作问题的编程思路请教(包含文件读写,提取,合并,文件内二进制数据比较等)

foniex 2008-04-10 10:16:07
由于工作上的需要,想写一个程序帮助自己,问题来源如下
首先有n个(n暂定为20)的二进制文件,均为293MB(308,000,004bytes),其中头4个bytes为文件信息描述,其余数据为100w x 308bytes二进制数据组成,每个308bytes数据为一个独立的key,而且任意一组key的头5个字节都是唯一的。
另外有m个(m暂定为200)的二进制文件,文件大小不定,但这些文件的内容均为一个数字(Size)的整数倍,且Size=k已知,而且如果以此size去读取文件,每个unit的头5个字节数据(特征字节)一定来源于n个文件中的某一个文件的308bytes key的头5个字节。

现在想编程实现:
将m个文件中的所有特征字节读出,并在n个文件中查找到对应的key,再将其对应的308 bytes key读取出来存储到一个文件之中。
规律:如果m个文件中某个文件的大小是k*10,意味着此文件共有10组特征字节,假设10组特征字节为S0,S1...S9,如果寻找到s0在n个文件的第x个文件中,则余下的9个特征字节也一定在这个文件中且是顺序排列的。

目前难点主要是读取的文件数众多,如何能够高效率实现特征key的读取和对比
...全文
118 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
foniex 2008-05-21
感谢诸位大大的见解
目前暂时先采用内存映射+多线程方式加快搜索速度
回复
WingForce 2008-04-10
文件内存映射
http://topic.csdn.net/u/20080409/17/c257bf47-c4df-4327-917b-b2f72f64b12c.html
回复
cnzdgs 2008-04-10
文件映射是用CreateFileMapping、MapViewOfFile等函数,LZ可以查看MSDN中的相关说明。用文件映射可以使文件的访问效率有所提高,但仍不足以解决你目前大数据量操作的问题。建议你重新组织数据,建立一个合适的索引机制。
回复
Yofoo 2008-04-10
[Quote=引用 6 楼 foniex 的回复:]
n=20只是暂定,以后会一直增加的,会越来越大,10个file 293×10约3G…
[/Quote]

库会越来越大, 库太大可以哈希散列成多个文件, 增加文件时重新维护库

数据量大要想提高效率, 索引是必须的, 方式可以自己决定
回复
foniex 2008-04-10
[Quote=引用 5 楼 Mackz 的回复:]
比较繁琐,唯一能想到的就是用内存映射文件提高文件操作的效率,其它都是一些固定的比较,很难优化。
[/Quote]

Marckz,能否提供内存映射文件的例程共参考
谢谢
回复
foniex 2008-04-10
[Quote=引用 2 楼 zzz3265 的回复:]
首先有n个(n暂定为20)的二进制文件,均为293MB, 如此巨大的数据可以自己建立Key的搜索库, 一次性建立可以永久使用
因为key的头5个字节都是唯一, 可以排序或哈希

n暂定为20, 其余数据为100w个 ,一组key的头5个字节, Key文件大小为: 20*1M*5


然后只需对m个文件进行读取, 在以上库中搜索即可, 速度应该很快
[/Quote]

n=20只是暂定,以后会一直增加的,会越来越大,10个file 293×10约3G,20个就6G,50个...
不敢想象了,目前没三个月就会增加5个file,一年下来就会有20个file,这样搜索库会越来越大
回复
菜牛 2008-04-10
比较繁琐,唯一能想到的就是用内存映射文件提高文件操作的效率,其它都是一些固定的比较,很难优化。
回复
skyful123 2008-04-10
不知道实际效果怎么样~呵呵
回复
skyful123 2008-04-10
前提 任意一组key的头5个字节都是唯一的。

先定义结构体三个字段

filename
key[]
total,

先读取特征文件写到结构体中.
然后读需要寻找特征的文件的第一个特征.

然后对两组结构体进行对比.相同的 就做后面的事情.并释放此特征结构体.

这样文件的只需要读一次获取了特征后就关闭了 .
内存消耗就降低了.

用对线程一起对比效率更高.
回复
Yofoo 2008-04-10
首先有n个(n暂定为20)的二进制文件,均为293MB, 如此巨大的数据可以自己建立Key的搜索库, 一次性建立可以永久使用
因为key的头5个字节都是唯一, 可以排序或哈希

n暂定为20, 其余数据为100w个 ,一组key的头5个字节, Key文件大小为: 20*1M*5


然后只需对m个文件进行读取, 在以上库中搜索即可, 速度应该很快
回复
foniex 2008-04-10
我目前的思路如下:
1.先对m个文件进行读取,将所读到的5个特征字节按照下面的格式存储在临时文件中:
[File_1]
start= xxxxxxxxxx
end= xxxxxxxxxx
total= 5
[File_2]
start= xxxxxxxxxx
end= xxxxxxxxxx
total=1
...
[File_m]
start= xxxxxxxxxx
end= xxxxxxxxxx
total=3
2.读取临时文件中每个start的特征码,逐个与n个文件中的特征码对比,如果发现相符的,就按照total的数量读取a*308的数并追加存储到临时文件中。完成全部m个文件的读取比较后输出正式文件
问题:
1.按照这种思路,n个大文件的打开读取次数将达到n×m次,如何减小内存开销?
2.以CFile:ReadFile操作,必须把大文件读取到内存才能进行对比,占有前台资源很高,如果开线程,如何与对话框消息同步?
3.有没有办法不用把文件读到内存进行对比?
回复
wmouse 2008-04-10
视你的具体操作策略可以有一些技巧。
比如,在N个文件中,先打开一个,然后拿M个文件与之比对,则M个文件中,相符的文件,标记一下,在更换了N个文件中的另一个时,就无需比对了——因为已经在之前相符过了。这样文件打开次数就比N×M小。

赞同楼上关于内存映射的建议,否则Open一个大文件耗时太长。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-10 10:16
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……