我一直在尝试索引 Solr 上的大量文档(约 2 亿个文档)。我使用 Pysolr 进行索引。但是,Solr 服务器在编制索引时不断下降(有时在索引了 1 亿个文档之后,有时在大约 1.8 亿个文档之后,情况有所不同)。我不确定为什么会发生这种情况,是因为打开大小限制,即与我在使用 bin/solr start 启动服务器时收到的警告有关吗?
* [警告] *您当前的打开文件限制为 1024。应将其设置为 65000 以避免操作中断。
我在索引 25000 块时使用了多处理(但我也尝试使用更大的块并且没有多处理,但它仍然崩溃)。是因为向 Solr 发送的请求太多吗?我的 Python 代码如下。
solr = pysolr.Solr('http://localhost:8983/solr/collection_name', always_commit=True)
def insert_into_solr(filepath):
""" Inserts records into an empty solr index which has already been created."""
record_number = 0
list_for_solr = []
with open(filepath, "r") as file:
csv_reader = csv.reader((line.replace('\0', '') for line in file), delimiter='\t', quoting=csv.QUOTE_NONE)
for paper_id, paper_reference_id, context in csv_reader:
# int, int, string
record_number += 1
solr_record = {}
solr_record['paper_id'] = paper_id
solr_record['reference_id'] = reference_id
solr_record['context'] = context
# Chunks of 25000
if record_number % 25000 == 0:
list_for_solr.append(solr_record)
try:
solr.add(list_for_solr)
except Exception as e:
print(e, record_number, filepath)
list_for_solr = []
print(record_number)
else:
list_for_solr.append(solr_record)
try:
solr.add(list_for_solr)
except Exception as e:
print(e, record_number, filepath)
def create_concurrent_futures():
""" Uses all the cores to do the parsing and inserting"""
folderpath = '.../'
refs_files = glob(os.path.join(folderpath, '*.txt'))
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.map(insert_into_solr, refs_files, chunksize=1)
if __name__ == '__main__':
create_concurrent_futures()
我在某处读到标准 Solr 安装的硬限制约为 21.4 亿个文档。当有数百万个文档时,使用 Solrcloud(我从未配置过)会更好吗?它会帮助解决这个问题吗?(我还有另一个包含 14 亿个文档的文件,需要在此之后进行索引)。我只有一台服务器,尝试配置 Solrcloud 有什么意义吗?