- 浏览: 248669 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
sweed0:
为何每一段代码都重复一次呢?
spring注解实例二 -
Gary_Huangpf:
- - 插件报错啊
Ext前台分页 -
ddvk2007:
版主 我想請問你所說的mapreduce是hadoop的還是g ...
MapReduce中的Shuffle和Sort分析 -
人可木:
好问章,楼主写的相当详细。。。多谢。。。
findbugs插件的安装与应用 -
hautbbs:
按照博主的方法启动调试出现jvm terminated.Ex ...
10分钟学会使用MyEclipse断点调试js
Solr有个很方便的处理器叫DataImportHandler,可以通过配置配置db-data-config.xml配置各种数据源然后 Sets the default cursor type that is used for all result sets that are created by using this SQLServerDataSource object. 同时这样做的话也要设置Connection的两个属性:ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY.但跟踪源码发现Solr中已经有这样的设置.于是可以直接在db-data-config.xml中配置即可完成,具体配置如下: <dataSource name="dsSqlServer" type="JdbcDataSource" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" batchSize="3000" url="jdbc:sqlserver://192.168.1.5:1433; DatabaseName=testDatabase;responseBuffering=adaptive;selectMethod=cursor" user="sa" password="12345" /> 其中只要在URL中加上responseBuffering=adaptive;selectMethod=cursor即可,无论多大的表根据这个配置Solr都可以从中读取数据并索引完成,当然,前提是不发生什么故障,如网络故障.这一想法也得到了Solr开发人员的验证,以下是他们给我回复的邮件: 但如此还是会造成一种隐患,就是如果表数据太大.如此会导致Solr一直在那获取数据并且索引.一旦发生什么故障如网络问题,Solr之前所做的索引就会前功尽弃,因为我们根本不知道它索引了多少条,索引到了哪里(后来看代码其实这种担忧是多余的,一旦发生网络异常,Solr会抛出异常,然后进行回滚,将索引恢复到索引之前的状态,也就是说之前做的一切根本 You can _batch_ import your data using full import command by providing additional request parameter (see 于是我在db-data-config.xml中用如下配置: <entity name="TestEntity" dataSource="dsSqlServer" pk="Id" query="SELECT Id,Title,Author,Content,Url,AddOn FROM Test WHERE Id>=${dataimporter.request.offset} And Id<=${dataimporter.request.offset}+10000" > 同时运用
从中导入数据进行索引,很方便我们进行开发.但是之前从数据库导入数据一直有个问题,就是如果数据库中数据过大,就会导致内存溢出.自己经过阅读源码以及发邮件到Solr邮件列表,终于找到了解决办法,这里拿出来共享.
这里我的Solr版本是Solr1.4.0,数据库是Sql Server2005.其他数据库可能有些不适用(请在其他数据库运行成功的同学也分享下),但根据这个思路应该都有自己的解决方案.
DataImportHandler中从数据库导入数据进行索引主要通过JDBC进行处理.由于自己对JDBC的认识浅薄,一直认为JDBC是一次性将要查询的数据从数据库中数据读取过去.但没有想到其实从数据库获取数据其实也是以流的形式,可以一段段的获取.也就是可以在客户端每获取一条再从流中取新的一条数据如此取完为止(这里感谢高手提示).由于使用的数据库是Sql Server2005,本想通过它的sqljdbc.jar中获取些提示(尝试下源码没有成功),从Jar中大概发现Sql Server有这样的设置,于是上微软官网的MSDN获取到了答案(URL:http://msdn.microsoft.com/zh-cn/library/ms378663(SQL.90).aspx):
复制
public void setSelectMethod(java.lang.String selectMethod)
参数
selectMethod
A String value that contains the default cursor type.
备注
The selectMethod is the default cursor type that is used for a result set. This property is useful when you are dealing with large result sets and do not want to store the whole result set in memory on the client side. By setting the property to "cursor," you can create a server-side cursor that can fetch smaller chunks of data at a time. If the selectMethod property is not set, getSelectMethod returns the default value of "direct".
That's not really true. DataImportHandler streams the result from database query and adding documents into index. So it shouldn't load all database data into memory. Disabling autoCommit, warming queries and spellcheckers usually decreases required amount of memory during
indexing process.Please share your hardware details, jvm options, solrconfig and schema configuration, etc.
是白做,而Lucene写索引的速度又是相当慢,在如此长的时间内发生不可预见的问题绝对有可能).同时Solr要写完一次索引才会通知IndexSearcher让IndexReader去reopen,所以在那么长一段时间内所索引的数据你是无法搜索到.于是自己想通过ID(Solr里设置的<uniqueKey>)分批来处理.但这个ID是数字要更方便,比如设置个起点,和一次索引多少条.如起点为1,一次索引10000条。如此Solr会从1-10000,10001-20000,如此一直不停的索引下去.本想自己继承个DataImportHandler去处理,后来Solr开发者给我回复的邮件告诉我,Solr通过配置也完全可以实现,邮件内容具体如下:
http://wiki.apache.org/solr/DataImportHandler#Accessing_request_parameters), i.e.
query="SELECT * FROM my_table ORDER BY id LIMIT 1000000 OFFSET ${dataimporter.request.offset}"
and then calling full-import command several times:
1) /dataimport?clean=true&offset=0
2) /dataimport?clean=false&offset=1000000
3) /dataimport?clean=false&offset=2000000
etc
1) /dataimport?clean=true&offset=0
2) /dataimport?clean=false&offset=1000000
3) /dataimport?clean=false&offset=2000000
这些URL去请求SOlr进行索引.Solr会读取offset这个参数区建立query查询语句,然后去获取这些查询语句的数据去索引.但如此最好还是自己写个类做下控制.可以一开始获取表的总结果条数然后通过以上循环迭代完成.其中里面的+10000也可以设置为一个参数,如${dataimporter.request.intervalRows}表示一次获取多少条,然后在URL里加&intervalRows这个参数,具体我还还没试过.同时由于索引还是个长期的过程,所以这里最好记录好每次索引索引成功的间隔.比如在30000-40000索引成功的时候将他们记录日志.如此在索引40000-50000的时候一旦发生问题,我们可以通过日志获取上一次成功索引的间隔数,再从这个间隔去重新生成URL去索引数据.
以上希望起个抛砖引玉的作用,能对大家有所帮助,如果还有什么问题请留言。同时我这里处理的仅仅是SqlServer2005,其他数据库上操作成功的请分享下。同时如果你可以保证你间隔获取的数据如10000-20000这些数据不会导致内存溢出,那么你也可以不使用responseBuffering=adaptive;selectMethod=cursor这种配置.直接通过设置请求URL的offset来处理.
发表评论
-
solr服务器复制、服务器分发(shard)、Multicore(分片)配置,SolrJ的使用
2012-07-16 15:23 7315Solr服务器复制的配置 1,首先测试在本机上开启三个t ... -
Solr Replication(复制)是怎样工作的
2012-07-16 15:18 1179luence有一个 ... -
Solr Multicore 结合 Solr Distributed Searching 切分大索引来搜索
2012-07-13 17:58 944原文出处:http://blog.chenl ... -
solr学习资料收集
2012-07-13 17:57 1048学习新东西前,我一般都会先找些文章来看,整个原理呀 ... -
Searching过程详解
2012-07-11 11:41 10821.拦截请求,解析请求并构建相应的handler。 发送 ... -
solr的配置参数理解
2012-07-11 11:35 1064l dataDir参数 用于替换默认的索引数据目录(. ... -
Solr 3.5 + Tomcat7 + mmseg4j + 搜狗词库 -配置并运行
2012-07-11 11:22 1480这是我看到过的写的较好的一篇入门文章,个人觉得相对有些文章 ... -
solrj之二次开发
2012-07-11 11:19 1619Solrj已经是很强大的solr客户端了。它本身就包装了htt ... -
SOLR搭建企业搜索平台
2012-05-24 18:34 1814一、SOLR搭建企业搜索平台--MultiCore Solr ... -
solr理论
2012-05-24 17:11 10841、 solr基础 因为 Solr 包装并扩展了 Luc ... -
solr中Schema.xml和solrconfig.xml分析
2012-05-24 17:09 1701一、字段配置(schema) schema.xml位于s ... -
solr部署
2012-05-21 18:45 10101,从官方网站下载solr:apache-solr-3 ... -
lucene检索运算符
2012-05-05 13:05 1148lucene检索运算符: 1. “:” 指定字段查指定值 ... -
当前几个主要的Lucene中文分词器的比较
2012-01-05 15:36 14971. 基本介绍: paoding :Lucene ... -
全文检索lucene的使用和优化
2012-01-05 15:35 16641 lucene简介 1.1 什么是lucene L ... -
关于几种中文分词的比对
2011-12-06 09:34 1530目前lucene自身提供的StandardAnalyze ... -
lucene 索引 原理
2011-12-06 09:33 815Lucene是一个高性能的java ... -
lucene中QueryParser操作符的疑惑
2011-11-25 16:15 893在测试Lucene搜索时,对于 AND 与 + 的区别研 ... -
lucene学习资料收集
2011-11-25 16:09 817由于公司用到lucene,现对看到过的帮助较大的luce ... -
利用 Heritrix 构建特定站点爬虫
2011-11-25 15:41 866本文由浅入深,详细介绍了 Heritrix 在 Ecl ...
相关推荐
下面将详细探讨如何解决phpExcel导出大量数据时出现的内存溢出问题。 首先,需要了解phpExcel在内存使用上的机制。默认情况下,PHPExcel使用内存来存储单元格信息。这意味着,如果一次性读取或写入大量数据,就很...
Java中的Apache POI库是用于读取和...通过以上策略,可以有效地处理Java POI在导入大数据量Excel时的内存溢出问题,同时提高程序的运行效率。在实践中,应根据具体场景选择合适的优化方法,确保程序的稳定性和性能。
PIO 导入大量数据时的解决内存溢出问题 PIO 是一个 Java 库,用来读取和写入 Microsoft Office 文档,如 Excel、Word 等。然而,在导入大量数据时,PIO 经常会出现内存溢出的问题。这种情况下,我们需要找到一种...
总结来看,Java在处理大量数据导入时遇到内存溢出问题时,可以考虑使用CSV文件替代传统的Excel文件。通过逐行读取和处理CSV文件,可以有效控制内存使用,避免内存溢出。虽然这种方法需要对数据格式进行转换,并调整...
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
2、内存中加载的数据量过于庞大,如一次从数据库取出过多数据而没有采用分页读取。 在加载数据时,应该避免一次性加载太多数据,而应该采用分页读取的方式来减少内存的占用。 3、异常时没有加 finally{}来释放某些...
内存溢出问题是参加kaggle比赛或者做大数据量实验的第一个拦路虎。 以前做的练手小项目导致新手产生一个惯性思维——读取训练集图片的时候把所有图读到内存中,然后分批训练。 其实这是有问题的,很容易导致OOM。...
这些工具通常包括数据导入导出、数据同步、数据库备份恢复、性能优化等功能。例如,MySQL的`mysqlimport`命令行工具,用于快速导入大量数据;Oracle的SQL Developer,提供图形化的数据库管理界面;还有诸如Toad、...
绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...
在这个场景中,我们需要利用iText来从数据库导出大量数据并生成PDF文件。以下是关于这个主题的详细知识: 1. **iText简介**: iText是一个开源的Java库,它提供了创建、读取、更新和签署PDF文档的功能。它支持多种...
JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...
在解决此类内存溢出问题时,应首先考虑优化应用程序中的内存使用和数据库操作,比如优化数据访问逻辑、增强应用的内存管理能力、调整JVM堆内存设置等。同时,针对并发编程中的并发集合使用要进行优化,减少不必要的...
在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...
数据库查询是应用程序与数据交互的重要环节,当一次性从数据库中获取的数据量过大时,可能会导致内存溢出(Memory Overflow)问题。内存溢出是程序在申请内存时,无法在分配到足够的内存空间来完成操作,这通常是...
根据这个设计方案,做了详细的实现,经项目验证,Excel文件20W条数据不成问题,因为Excel解析是我自己原创的行级处理器,不会一次性生成很多对象,因此不存在内存溢出现象,只要excel文件放得下,有多少记录都没问题...
解决传统方式的超大数据导致内存溢出1.xml解析以dom4j的事件驱动、分段边读边写(预处理sql批量写入数据库)、写完清空内存的实现思路解决超大xml解析时的内存溢出问题。 2.大数据导出到Excel、使用SXSSFWorkbook...
在处理大量数据时,通过合理配置JDBC连接参数和采取一些最佳实践,可以有效避免内存溢出的问题。对于MySQL、SQL Server和Oracle等不同的数据库系统,虽然具体的配置有所不同,但核心思想都是减少一次性加载到内存中...
在Java开发中,当面临大批量数据导出到Excel...通过这些方法,我们可以在处理大量数据导出到Excel时避免内存溢出问题,同时保持程序的稳定性和效率。在实际应用中,可以根据具体需求和环境选择合适的方法进行组合使用。
内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...