1,讀取文件大小(比如大小是200K)。
2,啟動5個線程,第一個線程從其實讀,第二個線程跳過40在讀40。。。
Ⅱ java多線程處理大批文件
線程數量一般是個估算值。這個要憑經驗來判定。
判定規則如下:
如果您能保證您的線程程序不會因為等待任何I/O事件產生等待(比如等待網路、等待資料庫、等待磁碟),那麼應創建CPU進程個數個線程數。
如果您的線程程序I/O等待時間和執行時間大致相等,應創建CPU進程數x2個線程數。
Ⅲ java 多線程讀取txt 文件
多線程將讀取的數據全部讀取到一個Buffer裡面去,然後再通過Buffer去處理,也就是版生產者消費者模型,你將權txt讀取到一個ByteBuffer或者是大位元組數組隊列裡面都可以,然後通過其它處理線程進行按行分隔
Ⅳ java中怎麼用多個線程同時對一個文件讀取,最終將文件內容保存到一個位元組數組中去呢
多線程復讀取文件在一塊硬碟上沒制用,瓶頸在硬碟I/O,而不在CPU和內存。讀取文件時,CPU不用復雜的計算工作,只是數據傳輸而已,多線程反而造成磁頭來回移動,效率不高。如果是兩塊以上的硬碟,可以用不同的線程訪問不同的硬碟,效率比單線程要高
而且多線程操作同一文件除了效率還會有多線程問題,多個線程同時往數組里存數據還會有線程安全問題,如果不同步處理讀取的文件就是錯誤的。
如果讀取的話只能設置每個線程各自讀取偏 移量
讀取文件大小(比如大小是200K)。 2,啟動5個線程,第一個線程讀到40,第二個線程跳過40在讀到80,總之得合理安排好各個線程讀取的大小。這樣才能不重復讀取。大數據處理框架maprece原理和此類似
Ⅳ java 利用RandomAccessFile實現多線程並發讀寫一個大文件
樓主,如果寫,先判斷要寫多大的文件、然後分段寫,各線程寫自己的段
如果讀,也是先得到文件大小、再分段,然後各線程讀自己的段
Ⅵ java多線程讀寫文件
public static void main(String[] args) {
File data = new File("data.txt");
try {
InputStreamReader read = new InputStreamReader(new FileInputStream(
data), "UTF-8");
final BufferedReader bufferedReader = new BufferedReader(read);
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@
public void run() {
String lineTXT = null;
synchronized (bufferedReader) {
try {
while ((lineTXT = bufferedReader.readLine()) != null) {
System.out.println(Thread.currentThread()+":"+lineTXT);
bufferedReader.notify();
bufferedReader.wait();
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
bufferedReader.notifyAll();
}
}
}
}).start();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Ⅶ java多線程同時讀取一個文件,這個方法可行嗎
不可行。
多線程能夠提高效率是因為現在的cpu普遍是多核cpu, 多條線程可以在版多個內核中權同時執行來提高計算效率。但是計算機磁碟的磁頭只有一個,即使多條線程去讀也並不能提高讀取效率,反而因為多線程的上下文切換問題會耗時更久。
Ⅷ 如何用多線程讀取大文件並且做數據處理,100
先說幾個要點:
a、文件在操作系統級,有描述符標記,關聯到打開的文件表項,文件表項紀錄了一個很重要的信息,當前文件的指針;
b、cpu要乾的工作比讀文件快不,讀一次文件的速度要慢於cpu處理一次的速度,沒必要多多線程,多線程提升不了多少性能,還增加編程的難度,單線程處理即可。
c、待處理文件,必須知道一定的邊界值,如分頁邊界或單條紀錄邊界。
有了上面的前提,每個線程維護單獨的緩沖區,緩存區大小就是c點提到的邊界紀錄大小。線程啟動,把緩沖區讀滿,處理數據。此處有個要點,必須做文件鎖,把要讀的邊界鎖住。否則讀出來的數據會產生混亂。(如果強行打開多個不同的文件不劃算,內存佔用可能會過多)。產生混亂的原因簡單,讀文件實際上是進行系統調用,系統調用有自己的緩沖區,這緩沖區未必跟你設置的緩沖區一樣大。多次讀多次移動指針,不加文件鎖處理的數據必定會亂。
文件鎖兩種方式加鎖,對整個文件加鎖,對位元組區間加鎖。都不是什麼難事。
實現方式1:對整個文件加鎖,因為我們要保證的是讀到的數據別混亂。
實現方式2:如果內存足夠大,維護n個獨立的文件描述符,這些文件描述符必須有獨立的文件指針,操作系統上有對應實現。每個線程操作未讀紀錄,這么做還需要維護共享的已讀紀錄指針。防止重復處理。這么做處理完成如果需要按順序合並文件是難點。處理過的數據有新的紀錄邊界。要視實際情況而定能不能這么做。寫程序要優先保證的是正確性,之後才是提升效率。
我說的理論,依據是操作系統提供的api處理。別的語言要依賴操作系統運行。原理差不多,目標語言有沒有操作系統提供的api強悍。依據使用的目標語言而定。絕大多數能叫編程語言的語言都會提供操作系統api對應的方法。(腳本語言例外,如shell,perl,javascript,vbscript,就可能沒這么強的控制能力。),java,objective-c,swift,php,python一般是不會有問題的。
Ⅸ java讀取解析大文件 40G左右求出name重復次top10的信息並輸出求教高手,怕以後遇到類似問題
1、首先大文件統計詞頻如果不依賴第三方組件的話實現起來很麻煩沒有回相關經驗的話很容易出問題答
2、若要使用java原生庫的話建議使用多線程構建一個MapRece模型,多線程逐行或者按塊讀將各自任務下的詞頻統計到DB
3、若使用第三方的話建議使用solr或者flink這種高度封裝的組件既可以保證結果的正確性也可以保證性能