Rumah  >  Soal Jawab  >  teks badan

java - 读取大于内存的大文件怎么读?

参考:
    有一个1G大小的一个文件,内存限制大小是10M,有序返回频数最高的50个词,该怎么做?

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

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

PHP中文网PHP中文网2742 hari yang lalu955

membalas semua(6)saya akan balas

  • 黄舟

    黄舟2017-04-18 10:57:16

    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.

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:57:16

    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.

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:57:16

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

    balas
    0
  • 高洛峰

    高洛峰2017-04-18 10:57:16

    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

    balas
    0
  • 怪我咯

    怪我咯2017-04-18 10:57:16

    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.

    balas
    0
  • 阿神

    阿神2017-04-18 10:57:16

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

    内存映射

    • mmap

    • BuatPemetaan Fail

    balas
    0
  • Batalbalas