簡體   English   中英

數組范圍或同步讀取輸入文件

[英]Array range or synchronized reading from input file

我正在嘗試同步我的過程,但對此有疑問。 我只有一個輸入文件可供讀取。 我正在考慮將read方法同步到線程。 相反,您如何看待在創建線程之前將文件讀入數組,然后將數組除以線程數呢? 每個線程只能使用此數組的范圍。

非常感謝大家。

為了提高性能,我可以建議您一些方法:

  • 如果只是簡單地插入文件內容,則可以使用LOAD DATA INFILE(mysql字)或批量插入(oracle字),也許您需要在一個線程中從該文件創建另一個文件。

  • 您可以將文件拆分為1000或10000行(示例),並使用多線程處理來使用線程池管理文件,以管理線程號https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

  • 在一個線程中讀取文件,然后使用線程池將插入操作提供給另一線程(也許更簡單)。

  • 使用ETL來做到這一點。

相反,您如何看待在創建線程之前將文件讀入數組,然后將數組除以線程數呢? 每個線程只能使用此數組的范圍。

是的,我認為這更有意義。 通常,當我嘗試處理文件中的條目時,我有一個線程正在從文件中讀取內容,然后將作業排隊以供線程池執行。 然后,我可以分配多個處理線程,這些線程從文件中獲取條目並通過ExecutorService處理它們。 根據實現,也可以從BlockingQueue中出隊。

在半代碼中,這看起來像:

 // file reader
 ExecutorService threadPool = Executors.newFixedThreadPool(NUM_WORKERS);
 while (true) {
    line = file.readLine();
    if (line == null) {
        break;
    }
    threadPool.submit(new MyRunnable(line));
 }
 // shutdown the pool after we submit the last line
 threadPool.shutdown();
 ...

 // multiple thread processors
 public class MyRunnable implements Runnable {
    private final String line;
    public MyRunnable(String line) {
       this.line = line;
    }
    public void run() {
        processLine(line);
    }
}

無需將線程爭奪訪問文件的權限,而是將讀取隔離到一個線程,將處理隔離到另一個線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM