机器学习和生物信息学实验室联盟

标题: 求助!!! [打印本页]

作者: hsc    时间: 2012-10-5 12:10
标题: 求助!!!
有谁对于处理IO方面有很深的了解?

我这里有一个数据结构,想要存储到硬盘上,要求还能保证数据结构的完整性,load进内存的时候可以直接用,但是怎么能把他最快的写入到文件中呢?当然该数据结构很大,最大的时候会有2^32-1的长度

另外还有一个文件中一个字符串有120万行,每行大概30个字符左右,我怎么把他快速load进内存,以便进一步处理

谁比较了解这方面的东西,深刻求教!!!
作者: xmubingo    时间: 2012-10-5 12:22
第一个问题,序列化写呢?

第二个问题,你之前不是做过IO测试么?读进花了多少时间?你可以把数据集和花的时间贴一下,其它人试试看还有没有更好的办法。
作者: chenwq    时间: 2012-10-5 12:24
显然,我没有对处理I/O有很深入了解。
看描述,和StringIO的应用场景类似,此外,不妨也采用效率最好的bz2模块试试。
作者: hsc    时间: 2012-10-5 12:28
xmubingo 发表于 2012-10-5 12:22
第一个问题,序列化写呢?

第二个问题,你之前不是做过IO测试么?读进花了多少时间?你可以把数据集和花 ...

我设计一个索引结构,我测试了一下,索引和搜索花费的时间有90%都是在写入和读取索引上了,所以想知道怎么能快速的存储一个数据结构,还能保证他的完整性。

第二个问题,虽然之前测试过,但那个针对于没有目的的文件读取,这里已经是特定的序列串了,读取时候速度超慢!
作者: xmubingo    时间: 2012-10-5 12:29
Java Large Files Disk IO Performance
http://stackoverflow.com/questio ... disk-io-performance

作者: hsc    时间: 2012-10-5 12:29
chenwq 发表于 2012-10-5 12:24
显然,我没有对处理I/O有很深入了解。
看描述,和StringIO的应用场景类似,此外,不妨也采用效率最好的bz2 ...

现在就是无法把一个完整的大数据结构快速的保存和读取,如果这两个方面解决了,那搜索起来就是唰唰的~
作者: hsc    时间: 2012-10-5 12:35
xmubingo 发表于 2012-10-5 12:29
Java Large Files Disk IO Performance
http://stackoverflow.com/questions/964332/java-large-files-dis ...

他这些都貌似只是把内容写入硬盘就OK了,我还想保存完整的数据结构,这样搜索的时候,就是直接映射读取,现在我就知道一个writeObject,但是还是很慢~
作者: xmubingo    时间: 2012-10-5 12:36
hsc 发表于 2012-10-5 12:28
我设计一个索引结构,我测试了一下,索引和搜索花费的时间有90%都是在写入和读取索引上了,所以想知道怎么 ...

你的索引和搜索是怎么建立?为啥需要从硬盘上读写索引?

--

你试试加大BufferedReader的buffer大小。
不行的话就多线程试试,看我发的那个连接
作者: xmubingo    时间: 2012-10-5 12:37
hsc 发表于 2012-10-5 12:35
他这些都貌似只是把内容写入硬盘就OK了,我还想保存完整的数据结构,这样搜索的时候,就是直接映射读取, ...

那个链接可以用来读取你的120w行的数据
作者: hsc    时间: 2012-10-5 12:40
xmubingo 发表于 2012-10-5 12:36
你的索引和搜索是怎么建立?为啥需要从硬盘上读写索引?

--

现在当然不需要,但是如果对于稍微大一点的文件来说,比如说1G的序列,那我拆分成子串也许就是10G,这样的话,内存是放不下的,所以必须得在硬盘上备份,这样的话,一次建索引,以后都能搜索了。

我设计的索引结构暂时分三块,第一个是原有序列的索引,第二个是子串序列的索引,第三个是子串序列索引的索引,现在第一个和第三个还好,关键是第二个就很大,我把子串进行编码,编码值就是他的位置,类似于hash表,这样的话,他的长度是巨大的,那么把这个完整的结构存储到硬盘上,我读取时候,直接地址映射搜索,很快就能完成,所以现在就是写入和读取的问题了~
作者: xmubingo    时间: 2012-10-5 12:45
你的意思是,你有个10G大小的索引在硬盘,然后你想把它读进内存,然后搜索?可是10G的东西你怎么读进内存?
作者: hsc    时间: 2012-10-5 12:46
xmubingo 发表于 2012-10-5 12:37
那个链接可以用来读取你的120w行的数据

嗯,这个我下午试验一下,不过我正在想是不是边读取边编码,同步操作,这样的话,使用readBuffer可能会有点麻烦~
作者: hsc    时间: 2012-10-5 12:48
本帖最后由 hsc 于 2012-10-5 12:49 编辑
xmubingo 发表于 2012-10-5 12:45
你的意思是,你有个10G大小的索引在硬盘,然后你想把它读进内存,然后搜索?可是10G的东西你怎么读进内存?


我在写入的时候,动了点手脚,把索引分块进行索引,比如说前100万个地址的存储到第一个文件,然后依次,这样搜索的时候,需要哪个文件,我就读取那个文件,这样能保证内存和时间,我已经测试过了,现在关键就是怎么把他们合理完整的保证在硬盘?
作者: xmubingo    时间: 2012-10-5 12:58
hsc 发表于 2012-10-5 12:48
我在写入的时候,动了点手脚,把索引分块进行索引,比如说前100万个地址的存储到第一个文件,然后依次, ...

我明白你的意思了。
你现在用hashmap保存<地址,子串>,然后因为这个太大了,比如说有10G,你拆成了100份来存,每个100M。
你是咋么将hashmap分成10块的啊?如果是write object(hashmap hm)的话。

你找个内存大点的机器直接让它常驻内存了。server-slave进程,server作为后台进程,给予查询回复。
如果索引是不变的,你就用数据库来存,存入的时候会慢点,但是查询肯定会快。
再不然你就搞成hadoop吧。
作者: hsc    时间: 2012-10-5 14:04
xmubingo 发表于 2012-10-5 12:58
我明白你的意思了。
你现在用hashmap保存,然后因为这个太大了,比如说有10G,你拆成了100份来存,每个1 ...

我是前多少个存储到第一个文件,然后就这样分的,我现在还没想用其他的技术,就是想能不能简单的开始,简单的解决~
作者: tangzk    时间: 2012-10-5 16:40
本帖最后由 tangzk 于 2012-10-5 17:23 编辑

IO问题历来都是瓶颈的,不过有些可以处理下。
1、压缩数据结构表达,能用bit/byte的话不要用integer了,精简再精简。实在不行就划分数据结构,开多个线程写入至多个文件;
2、如果现成的文件读入就没办法做压缩处理了,那么同样还是开多个线程吧,每个线程负责其中一块。
思维基本上还是集中并行化处理这部分。使用异步IO可以尝试下,具体没有试过,有可能可以超越并行线程的方式,参考类似Unix系统中的select模式。
作者: hsc    时间: 2012-10-5 21:21
tangzk 发表于 2012-10-5 16:40
IO问题历来都是瓶颈的,不过有些可以处理下。
1、压缩数据结构表达,能用bit/byte的话不要用integer了,精 ...

多线程我还没有尝试,如果简单的处理没有效果,再去尝试一下~~
作者: reck    时间: 2012-10-17 17:07
即便你要做搜索,实际情况其实很简单.
所有的文档分词后,合并一下产生的不重复的term与 document id组成 key-value放入 内存,最多也就几十MB。
另外 document id所对应的每个document 在磁盘的 存储 [起始,结束,文件名]作为key-value放入内存。
搜索的时候通过语法解析找到 term所对应的 document id。
然后通过document id去磁盘快速定位document ,这样不是都挺快么。

作者: hsc    时间: 2012-10-18 09:37
reck 发表于 2012-10-17 17:07
即便你要做搜索,实际情况其实很简单.
所有的文档分词后,合并一下产生的不重复的term与 document id组成 ke ...

理论上是这样的,但是实际做起来,并不是想象中的那么顺利,而且这还是特定的字符串,不是全文索引,再加上使用Java做的,这就比较蛋疼了~
作者: reck    时间: 2012-10-18 14:31
hsc 发表于 2012-10-18 09:37
理论上是这样的,但是实际做起来,并不是想象中的那么顺利,而且这还是特定的字符串,不是全文索引,再加 ...

再复杂再大的数据,也能够抽象成最简单的映射,关键在于你怎么想了。
否则像lucene能支持TB级别数据量,而主要索引却加载在内存中,也是JAVA写的。
作者: hsc    时间: 2012-10-18 23:40
reck 发表于 2012-10-18 14:31
再复杂再大的数据,也能够抽象成最简单的映射,关键在于你怎么想了。
否则像lucene能支持TB级别数据量, ...

这个我自然是知道,关键是对于这样的问题描述,我暂时想不起来一个好的解决方案,http://www.iteye.com/problems/89269 这是我曾经写过的一个问题描述,你看有没有比较好的解决办法或者比较合适的数据结构,如果能用luence做是最好的,但是利用luence我是想不出一个比较好的操作方法~
作者: hsc    时间: 2012-10-18 23:42
reck 发表于 2012-10-18 14:31
再复杂再大的数据,也能够抽象成最简单的映射,关键在于你怎么想了。
否则像lucene能支持TB级别数据量, ...

我自己设计的结构以及IO处理现在遇到的问题是IO慢,以及如果Hash结构中冲突次数太多的话,也就是一个串重复率特别高的话,就会很慢~~~




欢迎光临 机器学习和生物信息学实验室联盟 (http://123.57.240.48/) Powered by Discuz! X3.2