solr大批量資料匯出

2021-08-28 07:09:56 字數 1925 閱讀 3029

需求

有100個core,每個core4000w資料量。把所有資料匯出來。

方案1.

直接對每個core通過httpsolrclient先取出總條數,然後通過每次分頁讀n行,直到讀完,這個方案肯定不行,因為越到後面,讀取速度越慢,不用想都要很長時間。

方案2.

深度分頁

通過游標,可以使分頁速度很快。

solrquery solrquery =

newsolrquery()

;solrquery.

setquery

("*:*");

solrquery.

setfields

("*");

solrquery.

addsort

("uid"

, order.asc)

; string cursormark = cursormarkparams.cursor_mark_start;

solrquery.

setrows

(config.

getblocksize()

);boolean done =

false

;while

(!done)

if(nextcursormark == null || cursormark.

equals

(nextcursormark)

) cursormark = nextcursormark;

}

但是發現每次查詢都很慢,qtime基本都在1s以內,但是拿到queryresponse要1分鐘。不知道為什麼。網上說qtime只是返回所以資料id的時間,但是返回資料還要時間

方案3通過embeddedsolrserver提取

這個是比較底層的操作,也是先得到總條數,然後通過每次分頁讀n行,直到讀完。

進過測試一小時700多萬條資料輸出,但是也越往後越慢,乙個core執行完需要15小時

方案4直接lucene讀取

lucene也有兩種,一種是直接讀取全部資料放記憶體,說是速度很快,但是記憶體占用太大。所以還是用luncene的分頁演算法。

directory dir = fsdirectory.

open

(paths.

get(corepath, key,

"data/index"))

;indexreader indexreader = directoryreader.

open

(dir)

;query query =

newmatchalldocsquery()

;indexsearcher searcher =

newindexsearcher

(indexreader)

;int pagestart =0;

scoredoc lastbottom = null;

int count =0;

while

(pagestart <

100000000

)pagestart += tds.scoredocs.length;

lastbottom = tds.scoredocs[tds.scoredocs.length -1]

;list

list =

newarraylist

();for

(scoredoc sc : tds.scoredocs)

indexreader.

close()

;dir.

close()

;system.out.

println

(key +

"end................."

);

這個方法乙個core幾十分鐘就搞定了

關於SXSSFWorkbook匯出大批量資料的問題

前段時間做了乙個匯出大批量資料的功能,但是由於資料過多使用sxssfworkbook會出現記憶體溢位的問題,主要有兩個地方容易溢位。1.乙個是從資料看讀取資料到記憶體時溢位,基本資料超過20w或者2m時會溢位 這個時候改 xms1024m xmx1024m xx permsize 512m xx m...

關於SXSSFWorkbook匯出大批量資料的問題

主要有兩個地方容易溢位。1.乙個是從資料看讀取資料到記憶體時溢位,基本資料超過20w或者2m時會溢位 這個時候改 xms1024m xmx1024m xx permsize 512m xx maxpermsize 1024m 用處都是特別大 2.還有乙個就是在fileoutputstream os ...

mysql大批量更新資料

大批量的更新資料如果再使用傳統的 update 方法一條一條的更新,效率是很慢的,而且效能差,也很容易造成阻塞。1 使用mysql 自有的語句構建批量更新 update tble set price case id when 16 then 7.6 when 19 then 8.86 when 20...