최근에 저는 채용 담당자의 라이브 코딩 인터뷰 라운드에서 이 질문을 받았습니다. 나는 이것을 코드로 어떻게 해야 할지 확신이 서지 않았다.
파일을 여러 파일로 분할한 다음 여러 스레드를 통해 해당 청크를 읽는 것을 생각했습니다.
그러나 나는 같은 것을 구현할 수 없었습니다.
구현 또는 다른 접근 방식에 대한 도움을 주시면 감사하겠습니다!
나는 "그것은 의존한다"라고 대답할 것이다. 인터뷰 시나리오에서 그들은 당신이 어디로 가는지 확인하기 위해 의도적으로 모호한 질문을 할 것입니다. 다른 사람들이 지적했듯이 파일에 대해 알아내고 파일에서 얻고자 하는 정보가 무엇인지 파악하는 것이 중요하며 잠재적 솔루션은 이러한 요인에 따라 크게 달라질 수 있습니다.
예를 들어 파일이 실제로 CSV이고 데이터(정렬, 개수, 집계 등)에 대해 잠재적으로 복잡한 분석을 수행하려는 경우 해당 파일을 H2와 같은 관계형 데이터베이스 테이블로 푸시하는 것은 나쁜 생각이 아닐 수 있습니다. . 파일에 더 많은 자유 형식 텍스트가 포함된 경우 Lucene으로 인덱싱하거나 ElasticSearch 인덱스에 푸시하고 Kibana로 찌를 수 있습니다.
그러나 이러한 솔루션 중 어느 것도 "코드로" 파일을 분석하지 않으며 파일이 100GB 동영상 클립인 경우 완전히 비효율적입니다. 그들이 "코드로" 파일을 분석하는 방법을 묻기 때문에 바이트 지향 I/O(예: Java InputStream) 대 문자 지향(예: 리더) 및 /또는 버퍼를 사용하여 잠재적으로 큰 파일을 읽는 방법(즉, 전체 파일을 메모리에 로드하지 않고).
다음은 간단한 코드 예입니다...
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();
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다