Если база данных уже не является частью вашего решения, я бы не усложнял его. Цитируя Часто задаваемые вопросы 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