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

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9774|回复: 21
打印 上一主题 下一主题

求助!!!

  [复制链接]
跳转到指定楼层
楼主
发表于 2012-10-5 12:10:45 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
有谁对于处理IO方面有很深的了解?

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

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

谁比较了解这方面的东西,深刻求教!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

22#
 楼主| 发表于 2012-10-18 23:42:27 | 只看该作者
reck 发表于 2012-10-18 14:31
再复杂再大的数据,也能够抽象成最简单的映射,关键在于你怎么想了。
否则像lucene能支持TB级别数据量, ...

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

使用道具 举报

21#
 楼主| 发表于 2012-10-18 23:40:13 | 只看该作者
reck 发表于 2012-10-18 14:31
再复杂再大的数据,也能够抽象成最简单的映射,关键在于你怎么想了。
否则像lucene能支持TB级别数据量, ...

这个我自然是知道,关键是对于这样的问题描述,我暂时想不起来一个好的解决方案,http://www.iteye.com/problems/89269 这是我曾经写过的一个问题描述,你看有没有比较好的解决办法或者比较合适的数据结构,如果能用luence做是最好的,但是利用luence我是想不出一个比较好的操作方法~
回复 支持 反对

使用道具 举报

20#
发表于 2012-10-18 14:31:51 | 只看该作者
hsc 发表于 2012-10-18 09:37
理论上是这样的,但是实际做起来,并不是想象中的那么顺利,而且这还是特定的字符串,不是全文索引,再加 ...

再复杂再大的数据,也能够抽象成最简单的映射,关键在于你怎么想了。
否则像lucene能支持TB级别数据量,而主要索引却加载在内存中,也是JAVA写的。
回复 支持 反对

使用道具 举报

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

理论上是这样的,但是实际做起来,并不是想象中的那么顺利,而且这还是特定的字符串,不是全文索引,再加上使用Java做的,这就比较蛋疼了~
回复 支持 反对

使用道具 举报

18#
发表于 2012-10-17 17:07:48 | 只看该作者
即便你要做搜索,实际情况其实很简单.
所有的文档分词后,合并一下产生的不重复的term与 document id组成 key-value放入 内存,最多也就几十MB。
另外 document id所对应的每个document 在磁盘的 存储 [起始,结束,文件名]作为key-value放入内存。
搜索的时候通过语法解析找到 term所对应的 document id。
然后通过document id去磁盘快速定位document ,这样不是都挺快么。
回复 支持 反对

使用道具 举报

17#
 楼主| 发表于 2012-10-5 21:21:26 | 只看该作者
tangzk 发表于 2012-10-5 16:40
IO问题历来都是瓶颈的,不过有些可以处理下。
1、压缩数据结构表达,能用bit/byte的话不要用integer了,精 ...

多线程我还没有尝试,如果简单的处理没有效果,再去尝试一下~~
回复 支持 反对

使用道具 举报

16#
发表于 2012-10-5 16:40:20 | 只看该作者
本帖最后由 tangzk 于 2012-10-5 17:23 编辑

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

使用道具 举报

15#
 楼主| 发表于 2012-10-5 14:04:23 | 只看该作者
xmubingo 发表于 2012-10-5 12:58
我明白你的意思了。
你现在用hashmap保存,然后因为这个太大了,比如说有10G,你拆成了100份来存,每个1 ...

我是前多少个存储到第一个文件,然后就这样分的,我现在还没想用其他的技术,就是想能不能简单的开始,简单的解决~
回复 支持 反对

使用道具 举报

14#
发表于 2012-10-5 12:58:34 | 只看该作者
hsc 发表于 2012-10-5 12:48
我在写入的时候,动了点手脚,把索引分块进行索引,比如说前100万个地址的存储到第一个文件,然后依次, ...

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

你找个内存大点的机器直接让它常驻内存了。server-slave进程,server作为后台进程,给予查询回复。
如果索引是不变的,你就用数据库来存,存入的时候会慢点,但是查询肯定会快。
再不然你就搞成hadoop吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-1 19:35 , Processed in 0.076882 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表