Study/Java

[TEST] File Read Performance (파일 읽기 처리 속도) - 2

LoonyHyun 2020. 12. 17. 13:06
반응형

이전 글 : loonyhyun.tistory.com/entry/TEST-File-Read-Performance-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B8%B0-%EC%B2%98%EB%A6%AC-%EC%86%8D%EB%8F%84

 

[TEST] File Read Performance (파일 읽기 처리 속도)

JAVA 에서 파일 읽기를 하면 대게 FileReader, FileInputStream, RandomAccessFile 을 사용한다. 파일 읽기 시 어떤 것을 쓰던 상관은 없지만 프로세스 처리 속도를 위해 빠르게 처리하기 위해서 Stream 을 많이..

loonyhyun.tistory.com

이전 글에서 Stream 기반의 파일 읽기 클래스가 처리 속도가 빠른 것을 확인했다.

 

같은 파일 읽기지만, 파일 전체 내용을 한번에 읽는 것과 필요한 부분을 여러번 읽는 것에 대해 테스트 할 것이다.

 

파일 읽기 - [전체] vs [일부+일부+일부+...+일부=전체]

 

비교 시 같은 파일을 사용했으며,

파일크기는 300KB 정도이며,

개인 PC로 진행했기에 처리 속도는 각자 다르게 나타날 수 있다.

처리 속도는 ms 기준이다.

  일부(1kb) + 일부(1kb) + ... + 일부 = 전체 전체
1회 1 0
100 38 10
1000 357 99
10000 3519 662

위와 같이 결과가 나오는 이유는 단순하게 생각하면 간단하다.

파일을 읽기 위해 [열고, 닫고] 를 단 한번을 하느냐, 아니면 여러번을 하느냐의 차이다.

그러나, 일부만 읽는 방식으로 처리 시 탁월한 장점이 존재한다.

 

메모리를 적게 사용한다는 것이다.

 

만약 읽으려는 파일이 대용량파일일 경우 메모리 부족으로 한번에 못읽을 수도 있고,

최대 byte 크기를 넘어 프로세스에서 오류가 발생할 수도 있을 것이다.

그렇기에 각각의 프로세스마다 적절하게 사용하는게 좋을 것이다.

 

------------------------------------------------
일부 읽기
------------------------------------------------
		RandomAccessFile raf = null;

		try {
			raf = new RandomAccessFile(FILE_PATH, "r");
			
			int size = 1024;
			byte[] bb = new byte[size];
			while (raf.read(bb) > 0) {
				
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(raf != null) {
					raf.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}


------------------------------------------------
전체 읽기
------------------------------------------------
		RandomAccessFile raf = null;

		try {
			raf = new RandomAccessFile(FILE_PATH, "r");
			
			long fileLength = raf.length();
			byte[] bbs = new byte[(int)fileLength];
			raf.read(bbs);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(raf != null) {
					raf.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}