java - 您将如何分析对于内存来说太大的文件?

标签 java multithreading

最近,招聘人员在一轮现场编码面试中问了我这个问题。我不知道如何用代码来做到这一点。

我想到将文件拆分为多个文件,然后通过多个线程读取这些 block 。

但我无法实现相同的功能。

任何有关实现或其他方法的帮助将不胜感激!

最佳答案

我会回答“这取决于”。在面试场景中,他们可能会故意给你一个模糊的问题,看看你会如何回答。正如其他人指出的那样,了解该文件以及您想从中获取哪些信息是关键,并且潜在的解决方案可能会根据这些因素而有很大差异。

例如,如果文件实际上是 CSV,并且您想要对数据进行潜在的复杂分析(排序、计数、聚合等),那么将其推送到关系数据库表(例如 H2)中可能并不可行一个坏主意。如果文件包含更多自由格式文本,您可能需要使用 Lucene 对其进行索引,或者将其推送到 ElasticSearch 索引中,然后使用 Kibana 进行查看。

不过,这些解决方案都不是“用代码”分析文件,并且如果文件是 100GB 的影片剪辑,则完全无效。既然他们问你如何“用代码”分析文件,我希望他们试图看看你是否知道如何进行面向字节的 I/O(例如 Java InputStream)与面向字符的 I/O(例如 Reader)以及/或如何使用缓冲区读取可能很大的文件(即不将整个文件加载到内存中)。

这是一个简单的代码示例...

import java.io.*;

public class StreamFile {
    /** Stream through a file using a buffer. */
    final static int BUFSIZE = 1024; // Use a 1K buffer.

    public static void main(String[] args) throws Exception {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(args[0])));
        long totalBytes = 0;
        byte[] buf = new byte[BUFSIZE];
        while (bis.available() > 0) {
            totalBytes += bis.read(buf, 0, BUFSIZE); // Do something here with the data in buf.
            System.out.println(totalBytes); // Show progress.
        }
        System.out.println("Read " + totalBytes + " bytes");
        bis.close();
    }
}

关于java - 您将如何分析对于内存来说太大的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56364781/

相关文章:

java - 从 beforeCompletion TransactionSynchronization 回滚事务?

java - 谁使用默认的 mongo 驱动程序在 java/morphia 上加载 DbRefs

java - 延迟输出JSP自定义标签?

multithreading - 澄清 request_threaded_irq 的行为

java - 多个 Java 线程在并发运行时访问相同的数据库记录

java - Seam的设计问题

Java 流按 List<Map<String, Object>> 分组到 Map<Integer, List<Integer>>

Java - 线程崩溃后应用程序无法正常工作

c++ - 在卸载 DLL 期间删除静态对象时退出线程会导致死锁?

C++ 多线程 - 代码输出