Если база данных уже не является частью вашего решения, я бы не стал добавлять дополнительную сложность к вашему решению. Цитируя SOLR FAQ , ваш контейнер сервлета выдает время ожидания сеанса.
На мой взгляд, у вас есть несколько вариантов (в моем порядке предпочтений):
Увеличение времени ожидания контейнера
Увеличить время ожидания контейнера. (параметр «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()
}