-
关于处理海量文件,求一个比较好的方案?10
我想处理一些文件的文本数据。是以一定的格式如分隔符分开的。这些文件都挺大的。一个文件应该是30M左右。
里面有一些要求,如某些列需要比较进行数据匹配。比如下面
students_1.txt
(格式为:学号,姓名,年龄,姓别,系别,班级)
100001,小A,20,男,0604,061401
100002,小B,20,女,0604,061401
100003,小C,20,男,0604,061401
100004,小D,20,男,0604,061401
100005,小E,20,女,0604,061401
100006,小F,20,男,0604,061401
100007,小G,20,女,0604,061401
(这是一些模拟数据,其实字段比这个还要多很多,大概差不多三十个左右)
工作模式应该是:
读取100个文件时,怎么处理哦?
我之前思路是:
读取:把文件名计算出来放到一个List里,然后迭代List。然后处理相关文件,
匹配:用split方式把它变成字符串数组,用数组元素进行比较
用单线程的方式。即一条线执行下去。一个文件一个文件地打开,读取,匹配,把匹配数据放到内存中关闭,再打开下一个。。。。。
谁有比较好的方案吗?比如匹配,是不是用正则表达式的方式代替split方式会好点。或者还有其它更好的吗?
对于100个文件来说,是不是用多线程的方式会好点?但如果10个线程同时开启。会加载300M文件放到内存中,会不会不合适?
请大哥们帮忙优化一下吧。。。谢谢。。
问题补充:
匹配没有问题,只是好像使用split方法性能不佳.
其实还涉及到分页的问题.第一次是搜索全部的数据,然后把匹配的数据记录标识(如文件名,位置)等放到一个list里.然后下次再访问的时候,取别的页的时候,可以直接通过记录信息定位到具体的数据.然后取就行了.目前是用RandomAccessFile这个类实现.(用buffer方式对这个类进行了包装).性能还是不是很好.主要是定位到某文件某pointer里.谁有比较好的文件读取器工具吗?
关于多线程搜索.刚才我试了一下,我控制不了.
我想通过一个线程池的方式.然后每次让10个线程进行.
只是不太会控制,如何分配这些线程.
比如我有100个文件,按理说,是一开始让十个线程进行搜索.其它的等待.然后某线程完成了后.再把这个线程分给搜索新文件.
我不知道,完成后,如何告知分配?(目前想着用回调)
但进行的时候,未分配的待搜索文件.如何让他们等待?是用sleep吗?还是?
PS:感谢bohemia 与taopian 的回答.能再给详细点方案吗?谢谢.
2009年1月17日 10:28
11个答案 按时间排序 按投票排序
-
采纳的答案
引用比如匹配,是不是用正则表达式的方式代替split方式会好点。
这真是RE所长。引用其实还涉及到分页的问题.第一次是搜索全部的数据,然后把匹配的数据记录标识(如文件名,位置)等放到一个list里.然后下次再访问的时候,取别的页的时候,可以直接通过记录信息定位到具体的数据.然后取就行了.目前是用RandomAccessFile这个类实现.(用buffer方式对这个类进行了包装).性能还是不是很好.主要是定位到某文件某pointer里.谁有比较好的文件读取器工具吗?
这就是在某些应用中的所谓Catalog模式,第一次对数据文件建立索引,而后由索引定位。引用关于多线程搜索.刚才我试了一下,我控制不了.
我想通过一个线程池的方式.然后每次让10个线程进行.
只是不太会控制,如何分配这些线程.
比如我有100个文件,按理说,是一开始让十个线程进行搜索.其它的等待.然后某线程完成了后.再把这个线程分给搜索新文件.
我不知道,完成后,如何告知分配?(目前想着用回调)
但进行的时候,未分配的待搜索文件.如何让他们等待?是用sleep吗?还是?
涉及到海量数据的处理,多线程肯定需要的,IO瓶颈是必须考虑的。
具体多线程方案:
建立一个线程数为10的线程池(参见java.concurrent package),建立搜索任务(同前),然后你只管将task往pool里面扔。Thread pool会帮你管理线程的。
2009年1月18日 02:19
-
涉及到海量数据的处理,多线程肯定需要的,IO瓶颈是必须考虑的。
具体多线程方案:
建立一个线程数为10的线程池(参见java.concurrent package),建立搜索任务(同前),然后你只管将task往pool里面扔。Thread pool会帮你管理线程的。
这个说的很正确,我补充一点,还需要在你的工作现场中加一个状态,用于表示当前文本处理的状态,成功失败正在处理等. 你只有当所以的任务都成功了你才能进行相关的后续工作.2009年1月18日 13:50
-
就这点文件, 怎么分析文件格式, 都是很快的, 一个线程差不多了。 瓶颈是在IO上。 楼主不相信的话, 你可以创建一个5G的文件测试下, CPU的计算非常快, 都是在等待读文件上。
2009年1月17日 16:42
-
引用读取,匹配,把匹配数据放到内存中关闭
一般这样处理就差不多了吧.每行的处理逻辑简单;
引用如某些列需要比较进行数据匹配
如果需要对固定的列做处理;貌似正则表达式做起来,麻烦些;
如果你的文件,每个的规则都不同;要写N个规则,换比不上单个处理起来块;
如果要提高总体效率,可以采用多线程方式; 不过这样对内存占用无法限制;
我感觉比不上上面的方式好.2009年1月17日 10:58
相关推荐
总结来说,Hadoop通过HDFS和MapReduce为处理海量文件提供了高效的分布式计算解决方案。Hadoop的易用性使得开发者即使没有并发或分布式系统经验,也能轻松处理大规模数据处理任务。此外,Hadoop还广泛应用于数据挖掘...
海量数据存储解决方案 海量数据存储解决方案主要解决了企业在海量数据...这些成功案例证明了DellEMC的解决方案能够帮助企业高效地存储、处理和分析大量的结构化和非结构化数据,为企业提供了一个强大的数据管理平台。
- **初步思路**: 将所有IP地址写入一个大文件,考虑到IP地址的范围为2^32,可以使用映射的方法将这些IP分散到较小的文件中。 - **具体步骤**: - 将IP地址按照模1000的方式映射到1000个小文件中。 - 对于每个小...
综合以上分析,这个压缩包文件集合为学习和理解海量数据处理提供了一个全面的资源库。学习者可以通过阅读和研究这些文档,系统地了解大数据处理的各个方面,包括数据的存储、计算、清洗、分析和应用,从而提升自己在...
- 如何设计一个高效的搜索引擎来处理每天新增的数百万条网页数据? #### 八、外排序 **定义**: 外排序是指数据量超过了内存容量,需要借助磁盘等外部存储设备进行排序的方法。 **应用场景**: - 大规模数据集的...
例如,对于每份1GB大小的文件,可以将其中的每个记录映射到一个16位的键值对中,并通过MapReduce将这些键值对汇总到一个1MB大小的文件中。这种方法不仅能够简化数据处理流程,还能够利用分布式计算的优势加速处理...
综上所述,海量文档相似性计算引擎方案是一个复杂而全面的技术方案,它利用SimHash算法生成文档数字签名,通过海明距离计算文档间相似度,借助中文分词技术和TF-IDF算法进行文本分析和处理,采用分布式计算应对大...
【海量数据处理平台建设方案】是针对现代信息技术领域中...综上所述,这个海量数据处理平台建设方案旨在通过虚拟化和分布式技术,构建一个高效、可靠、易于扩展的数据处理基础设施,以适应日益增长的海量数据处理需求。
海量数据处理涉及多个层面的技术优化,包括数据层架构的设计、数据同步方案的选择、图片存储与缓存策略、分布式缓存技术的应用、数据库性能优化等。通过综合运用这些技术和方法,可以有效提升系统的性能和稳定性,...
3. K-way Merge:当内存允许存储k个已排序的小文件时,可以同时读取k个文件,并进行k路合并,逐步减少文件数量,直至只剩一个有序文件。 二、分布式排序(Distributed Sorting) 分布式排序利用多台计算机的并行...
总结来说,这个海量数据处理平台的建设方案关注于通过虚拟化和分布式计算技术,构建一个高效、弹性、安全的大数据处理环境。它不仅能够优化资源利用,还能够适应各种业务需求,提供稳定的服务保障,同时确保数据的...
【NAS海量文件存储数据异地容灾方案】 NAS(Network Attached Storage)网络附加存储是一种专门用于文件级别的集中存储和共享的解决方案。它允许多台服务器通过网络访问统一的存储空间,适用于处理大量的文件数据,...
这些方法并非孤立使用,而是相互配合,共同构成一个完整的海量数据处理优化方案。在实践中,工程师需要根据具体业务需求和系统资源,灵活应用这些技术,以实现最优的数据处理效果。同时,持续学习和积累经验,不断...
Hadoop 还包括HDFS(Hadoop Distributed File System),这是一个分布式文件系统,可以存储海量数据并确保高可用性和容错性。 另一个重要的大数据查询工具是Apache Spark。Spark 提供了比Hadoop更高效的内存计算,...
2. 处理海量小文件的优化方案:通过对现有解决方案的分析,提出利用CFIF(Combine File into a File)抽象类将多个小文件打包成一个大分片,然后对每个大分片启动一个Map任务执行。这种方案通过减少Map任务的启动...