java - 读取大于内存的大文件怎么读?
PHP中文网
PHP中文网 2017-04-18 10:55:16
0
6
991
参考:
    有一个1G大小的一个文件,内存限制大小是10M,有序返回频数最高的50个词,该怎么做?

网上有很多该问题的解决方案,都是用分而治之的思想,提到了遍历整个文件。

那么我的问题是:
如果单纯地逐行读取大文件,算是把1G文件全都加载进内存吗?
或者说是读取大于内存的文件应该怎么读?

PHP中文网
PHP中文网

认证0级讲师

membalas semua(6)
黄舟

Di sini ingatan adalah seperti paip membaca baris demi baris hanya untuk menghantar fail 1G melalui memori 10M mewakili ketebalan paip.
Jadi, bacaan baris demi baris memerlukan memori 加载进去过 fail 1G.

伊谢尔伦
try (BufferedReader in = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = in.readLine()) != null) {
        // parse line
    }
}

Tidak kira betapa besar fail itu, selagi panjang setiap baris adalah terhad, ia akan mengambil banyak masa untuk membaca keseluruhan fail, tetapi ia tidak akan mengambil terlalu banyak memori.

伊谢尔伦

Baca dalam ketulan, baca satu set hasil untuk setiap ketul, dan akhirnya agregat set hasil
Apabila memproses teks, lebih baik untuk mengetahui bilangan baris

小葫芦

linuxTerdapat arahan di atas dipanggil split yang boleh membahagikan teks besar dengan cepat dan serentak kepada fail kecil, dan kemudian pemprosesan adalah mudah. ​​Algoritma ini dipanggil pengisihan luaran

刘奇

Memori seperti kertas conteng Apabila anda selesai menulis artikel, terbalikkannya. Data terpakai dan tidak digunakan dibuang.

Contoh mudah, buat buff pembolehubah, tetapkan saiznya, buka strim fail dan isikannya. Selepas ia diisi, semak kandungan yang anda mahukan Jika ditemui, ia akan dikira dalam pembolehubah lain. Kemudian kosongkan buff dan teruskan memuatkan kandungan sekali lagi pada kedudukan yang dibaca sebelum ini... Sehingga bacaan selesai, statistik selesai.

阿神

Untuk sistem yang berbeza, API akan disediakan untuk mengendalikan fail yang lebih besar daripada memori, iaitu, fail akan dianggap sebagai memori:

内存映射

  • mmap

  • BuatPemetaan Fail

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan