Java:使用终止信号确定数据导入的状态
幾周前,我正在嘗試將約6000萬位數(shù)據(jù)最初導(dǎo)入Neo4j,但我們一直遇到一個(gè)問題,即導(dǎo)入過程似乎停滯了,什么也沒導(dǎo)入。
很難分辨該過程中發(fā)生了什么—采取線程轉(zhuǎn)儲(chǔ)只是告訴我們它正在嘗試處理CSV行中的一行,并且以某種方式無法執(zhí)行。
一種幫助調(diào)試的方法是在處理過程中打印出CSV的每一行,然后觀察它被卡在哪里,但這似乎有點(diǎn)過頭了。 理想情況下,我們只希望打印出按需處理的行。
幸運(yùn)的是,我們可以通過向我們的導(dǎo)入過程發(fā)送一個(gè)終止信號(hào)并將其打印出到達(dá)的位置來完成此操作。 我們必須確保選擇了一個(gè)尚未由JVM處理的信號(hào),并決定使用'SIGTRAP',即kill -5 [pid]
我們遇到了一個(gè)簡(jiǎn)潔的博客文章,該文章解釋了如何將所有內(nèi)容連接起來 ,然后創(chuàng)建自己的版本:
class Kill3Handler implements SignalHandler {private AtomicInteger linesProcessed;private AtomicReference<Map<String, Object>> lastRowProcessed;public Kill3Handler( AtomicInteger linesProcessed, AtomicReference<Map<String, Object>> lastRowProcessed ){this.linesProcessed = linesProcessed;this.lastRowProcessed = lastRowProcessed;}@Overridepublic void handle( Signal signal ){System.out.println("Last Line Processed: " + linesProcessed.get() + " " + lastRowProcessed.get());} }然后,我們將其連接如下:
AtomicInteger linesProcessed = new AtomicInteger( 0 ); AtomicReference<Map<String, Object>> lastRowProcessed = new AtomicReference<>( ); Kill3Handler kill3Handler = new Kill3Handler( linesProcessed, lastRowProcessed ); Signal.handle(new Signal("TRAP"), kill3Handler);// as we iterate each line we update those variableslinesProcessed.incrementAndGet(); lastRowProcessed.getAndSet( properties ); // properties = a representation of the row we're processing這對(duì)我們來說確實(shí)非常有效,并且我們能夠得出結(jié)論,我們的CSV文件中的某些數(shù)據(jù)存在輕微問題,導(dǎo)致數(shù)據(jù)處理不正確。
由于CSV文件只有幾GB的大小,因此我們無法通過肉眼觀察到。 因此,我們僅略過幾行作為健全性檢查。
我什至不知道您可以做到這一點(diǎn),但是請(qǐng)牢記這是一個(gè)巧妙的技巧–我確信它會(huì)再次有用。
翻譯自: https://www.javacodegeeks.com/2014/07/java-determining-the-status-of-data-import-using-kill-signals.html
總結(jié)
以上是生活随笔為你收集整理的Java:使用终止信号确定数据导入的状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成语汤去什么面 成语汤去什么面是什么成语
- 下一篇: JUnit:使用Java 8和Lambd