- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《java对大数据量文件内容的多线程读取和排序
java对大数据量文件内容的多线程读取和排序,该怎么处理
java对大数据量文件内容的多线程读取和排序1.Generate a random text file, which contains at least 100 Million lines. Each line must contain over 100 characters.2.Compose a Java program to sort the file within a standard qualified time (time for data IO is also counted). Less running time used, the performance is better. The program MUST NOT consume memory over 512M Bytes, and the usage of CPU is not limited.各位大侠,大家好,我现在有个棘手的题目,请大家帮忙,有满意答案后可给分题目翻译入下:1:生成一个随机的文本文件,其中包含至少10亿行,每一行必须包括100个字符。2:编写一个java程序,对此文本内容进行排序,排序计时,时间越少性能越好,内存不得大于512MB,CPU满意限制。? 个人愚见:可以考虑外部排序中使用线程来提高运行效率(cpu没有限制),到文件太大需分割(使用缓存)。如何组织好一个程序还望高手指教。最好有程序。谢谢了。------解决方案--------------------先翻译准确了,100M是1亿?------解决方案--------------------感觉楼主的需求还没有描述完全,问题漏洞太多。1.生成这样的文件,每行的信息内容是什么,是否包含格式?2.排序依据是什么,如何排序。3.排序结果是什么,如何体现。我自己臆测下你这个题目锁涉及的难点吧。1.文件过大,不可能一次性load。基于效率问题,批量读取,控制buffer大小提高效率。如果是xml文件就使用Sax解析方式,基于流。2.排序后结果统计非常麻烦,如果是把排好序的文件重新生成难度就体现出来了了,如何插入排序方式无需整理结果文件,但需要遍历原始10亿*10亿次。需要人为策略优化。我个人优化思路如下:1. 读取文件基于流,每次读一行,自行判断换行符号,将排序方式编码成权计算,计算出比较权值。形成 [文件流byte[offset]:length:行号:权值] 信息。将索引信息存放内存,因为数据量小不会耗费大量内存。(该过程可以通过String buffer[] 来缓存一定数量的lineString信息[文件流offset,length],起用多线程并发并发计算权值)2. 对权值进行散列,适当控制散列堆大小,散列到不同的散列堆,然后进行排序。一个堆即一个具备排序功能的链式结构。通过权值散列到不同的排序堆堆。3.通过randeAccessFile 读取源文件,输出排序文件。如果排序文件可以分多个文件输出,可以依照排序堆,并给输出文件命名。sorted_1.txt sorted_2.txt ....... sorted_n.txt,这样在写文件时可以使用多线程进行提速。------解决方案--------------------IO 操作无法使用多线程,IO 操作的并发率为 0,也就是说不支持并发。使用多个线程读写文件,比单个线程会更慢,因为带来了更多的寻道时间。?------解决方案--------------------探讨OS 有的应该可以限制文件最大长度吧。这么大的文件,应该早就进行人为控制大小的切分,如果这是个面试题考考反映就合理了。一切皆可假设。------解决方案--------------------这个问题我也遇到过,我们公司考试考了一个这样的题,但是题不太一样,那是一个移动号码排序,139号码段,每天要把前面放出的号和当天放出的号合并成一个文件,并排序,以前放出的号没有说已经排好序,手机号码11位,去除前面3位还有8位基本上快到1亿,号码是一行一个号,txt格式,我这里给你一个思路,可以用内存映射,这种方式应该是java里能读的最大文件的方式了,这里只是读,另外就是排序,因为不知道你的文件内容是什么,所以不太好说,我就说移动这个吧,我们把文件读出来的时候对他分拆,设一个段,每一个段一个文件比如,以139001(139001*****)开头的写一个文件,以139002(139002*****)开头的写一个文件这样分成若干个小文件,再排序,最后把这几个文件合并就可以了。
文档评论(0)