Освен ако база данни вече не е част от вашето решение, не бих добавил допълнителна сложност към вашето решение. Като цитирам ЧЗВ за SOLR, вашият сервлет контейнер издава времето за изчакване на сесията.
Както виждам, имате няколко опции (в моя ред на предпочитания):
Увеличете времето за изчакване на контейнера
Увеличете времето за изчакване на контейнера. (параметър "maxIdleTime", ако използвате вградения екземпляр на Jetty).
Предполагам, че само от време на време индексирате такива големи файлове? Временното увеличаване на времето за изчакване може да е най-лесният вариант.
Разделете файла
Ето простия unix скрипт, който ще свърши работата (разделяйки файла на 500 000 реда):
split -d -l 500000 data.csv split_files.
for file in `ls split_files.*`
do
curl 'http://localhost:8983/solr/update/csv?fieldnames=id,name,category&commit=true' -H 'Content-type:text/plain; charset=utf-8' --data-binary @$file
done
Анализирайте файла и го заредете на парчета
Следният groovy скрипт използва opencsv и solrj, за да анализира CSV файла и да извърши промени в Solr на всеки 500 000 реда.
import au.com.bytecode.opencsv.CSVReader
import org.apache.solr.client.solrj.SolrServer
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer
import org.apache.solr.common.SolrInputDocument
@Grapes([
@Grab(group='net.sf.opencsv', module='opencsv', version='2.3'),
@Grab(group='org.apache.solr', module='solr-solrj', version='3.5.0'),
@Grab(group='ch.qos.logback', module='logback-classic', version='1.0.0'),
])
SolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr/");
new File("data.csv").withReader { reader ->
CSVReader csv = new CSVReader(reader)
String[] result
Integer count = 1
Integer chunkSize = 500000
while (result = csv.readNext()) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", result[0])
doc.addField("name_s", result[1])
doc.addField("category_s", result[2])
server.add(doc)
if (count.mod(chunkSize) == 0) {
server.commit()
}
count++
}
server.commit()
}
person
Mark O'Connor
schedule
26.02.2012