【问题标题】:What to choose to read from large file?从大文件中读取什么?
【发布时间】:2013-11-30 04:59:27
【问题描述】:

您能否告诉我,如果我需要从包含一些 UTF-8 格式的未格式化数据(主要是字符串文本)的非常大(~1Gb)的 .txt 文件中读取,该选择什么:Scanner、BufferedReader 或 mb 其他东西更好(可能来自 NIO 或侧库)?

【问题讨论】:

  • 这完全取决于你想要做什么。说明您将要进行哪种类型的处理。
  • 取决于文件中有多少字符串。一个简单的ScannerBufferedStream 就足够了。
  • 这里的关键是性能(因此您希望一次读取大块)和 UTF-8(对块不太友好)之间的冲突,如下所述。跨度>

标签: java input io


【解决方案1】:

这取决于您要对文件执行的操作。

例如,问问自己:

  • 我需要标记它吗?即,将其视为“单词”或“符号”流?
  • 是否需要将其拆分为几行并一次处理一行?
  • 是否需要将整个文件加载到内存中?作为一大堆字符、线条、标记?

一旦你弄清楚了事情的那一面,你正在考虑的读取文件的替代方法之一可能会比其他方法更好。

(如果我们不了解您打算如何处理数据,我们当然无法就读取数据的最佳方式向您提供合理/平衡的建议。)


我的建议是,将时间花在效率问题上之前,先考虑一下您是如何处理数据的。用于读取文件的技术/API 的选择很有可能不会限制您的应用程序的整体性能。

【讨论】:

  • 咳咳……在 219k 代表你应该知道这是评论。
  • 在 34k 代表处,您应该知道自己的位置!标记它并继续前进,无需公开谴责C先生!
  • 咳咳——作为一个 34k 的代表,你应该知道我还没有完成!这不是评论。这是关于如何解决问题的建议......尚未完全说明。
【解决方案2】:

文件的大小与正确性无关(只要您有足够的内存来存储中间数据),但在性能方面却很重要。 This website 解释了如何在 Java 中读取 UTF-8。它使用 InputStreamReader:

         try {
            Reader reader = new InputStreamReader(
                        new FileInputStream(args[0]),"UTF-8");
            BufferedReader fin = new BufferedReader(reader);

            String line;
            while ((line = fin.readLine())!=null) {
                // do something with line
            }
            fin.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

请注意,他逐行阅读。对于大文件,IO 性能很重要,因此您可能希望改为以 4k 或 8k 字节的块读取数据。请注意,虽然这可能会打断字符(由于 UTF-8 字符可以有一个或多个字节,因此无法提前判断字符是否正好在块边界上结束)。

在这种情况下,您要么希望在完成阅读之前将文本视为数据,要么必须遍历所有读取的字符以找出是否必须在处理之前将最后一个字节附加到下一个块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 2018-07-06
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多