컴퓨터/자질구레 팁

하드 용량 초과에 의한 에러

adnoctum 2011. 9. 17. 01:40


   가끔 코드에는 아무런 문제가 없지만 파일이 만들어지지 않는 경우가 있는데, 그럴 땐 일단 하드 용량을 확인해 보아야 한다. 이런 경우는 매우 여러 상황에서 발생할 수 있는데, 지금 나의 경우에는 터미널에서 작업하다가 다음과 같이 명령어를 주었다.


[adnoctum@bioism normal_pccq]$ egrep Cluster * | cut -f1,2,5 > cancer.cluster.
nonoverlapped.
pair.pccq. sum.cancer.txt &


현재 저 경로에 파일이 1000 개가 있고, 각각이 4.5MB 정도이고, Cluster 를 포함한 줄을 모두 모으면 대략 400만 라인이 되며, 저렇게 한 파일로 모을 경우 대략 600 MB 정도 될 것으로 예상하고 있었다. 저렇게 실행을 시켜 놓은 후 놀고 있었는데, 아무리 오래 걸려도 20분 정도를 넘지 않을 것으로 예상이 되었지만 top 으로 계속 확인을 하고 있는데도 끝나지 않는다. 뭔가 해서 봤더니, hard disk 용량이 모자라다는 메세지를 뿌려 놓고 실행이 중단된 상태.

   비단 이런 경우는 이렇게 터미널에서 작업할 때 뿐만이 아니라 코딩을 할 때도 자주 발생한다. 특히, 이런 경우는 아무런 논리적 에러도 나지 않고, 더구나 컴파일 에러도 없으며, 일반적으로 하드 용량이 모자랄 것이라는 생각은 잘 하지 않기 때문에 문제의 원인을 찾기가 난해할 때가 많다. 아무리 코드를 들여다 보아도 파일을 쓰지 못할 이유가 없는데 파일은 쓰여지지 않으니 답답하기만 할 뿐이다. 예전에 Visual C++ 을 갖고 코딩할 때도 이런 경우가 있었는데, 설마 하드 용량이 부족해서 파일을 쓰지 못할 것이라곤 상상도 못 했던 것이다. C++ 처럼 파일로 쓰는 속도가 매우 빠른 경우 순식간에 몇 십 GB 짜리 파일이 만들어지면서 하드 용량이 금방 동이 나곤 한다. 이런 경우는 주로 무한 루프에 빠진 코드 안에서 파일로 쓰는 부분이 있을 때 발생한다. 위처럼 재귀적으로 적용해서 끝나지 않고 계속 실행되면서 파일로 쓰게 되면 당연히 파일 크기가 계속 증가하다가 하드 용량이 동이 나면 에러를 뱉어 내고 멈춰 버리는 것.


   따라서 파일 쓰기 에러가 발생할 때는 이렇게 하드 용량을 확인해 보아야 할 경우도 생기고, 그것이 원인이었다면 문제는 파일로 쓰는 부분이 무한 루프에 빠졌을 가능성이 높다.

 덤으로, 파일을 쓸 때 써지지 않는다면 몇 가지 전형적인 원인은,
1. 권한 문제: 특히 리눅스. 요즘엔 윈도우즈도 그렇다.
2. 파일 이름 문제:
2-1. 파일 이름을 나타내는 문자열에 파일 이름으로 쓸 수 없는 문제가 오거나(가령 ? 가 파일 이름 안에 있는 경우),
2-2. 파일 경로가 너무 길어서 중간에 잘린 경우. MAX_PATH 나 PATH_MAX (윈도우즈/리눅스 (혹은 그 반대, ㅋ))로 정의된 상수 길이보다 긴 파일 이름은 만들어지지 않는다.
2-3. 없는 경로에 해당하는 파일 이름의 경우. 가령 D:\abc\def.egf 라는 파일을 쓰려 했는데 D 에는 abc 가 없으면 파일이 만들어지지 않는다.
2-4. 대소 문자 구분 문제: 종종 어떤 언어나 프로그램에서는 대소 문자를 구분하기도 한다. matlab 이었던가 maple 이었던가...
2-5. Unicode 문제: 어떤 프로그램의 경우 파일 경로(전체 경로)에 한글이 있으면 인식하지 못할 때도 있다. 그럴 경우엔 영어로만 된 경로에 놓고 실행하면 된다. 코드 상이라면 윈도우즈에선 CA2CT 나 CT2CA 를 사용해야 하겠지.
(이 문제는 가끔 DDX를 사용하는 프로그램의 경우 경로나 파일 이름에 공백이 들어가면 분리된 문자열로 인식해서 문제가 생길 경우가 있다. 그럴 땐 전체 경로를 쌍따옴표로 묶어 주면 된다)
3. 파일 엑세스 권한 문제: 가령 윈도우즈에서 API의 CreateFile에 GENERIC_READ 을 넘겨서 파일을 열 경우 쓸 수 없겠지, 당연히.

이 정도가 된다. (또 생각나면 추가해야지,ㅋ)