특정 파일의 메모리

익명 사용자의 이미지

어떤 특정 파일을 열어서 한글자씩 읽어들인 다음.
일정 연산..(뭐 비트 연산 등...)을 거쳐
버퍼에 저장한 다음 다른 파일에 저장하는 프로그램을 하려고 합니다.
그런데, 이 틀정 파일이란놈이 사이즈가 정해져 있지가 않아서 무쟈~게 커
다란 파일은 버퍼를 무한정 많이 잡을수도 없고 해서요..
미리 malloc를 해놓으려고 하는데.. 메모리 사이즈가 정해져 있지 않아
서 어찌 해야할런지 모르겠네요.
그래서, 어떤 파일의 메모리 사이즈를 알수 있는 방법이 없나요.
malloc할 수 있는..사이즈요...
부탁드립니다.

익명 사용자의 이미지

통상적으로 큰파일을 다룰때 많은양의 memory는 alloc하지 않습니다.
(mmap등으로 파일을 memory에 mapping하는 경우도 있지만 흔치는 않습니
다.)
바로 파일로 내보내 버리죠.

즉 다음과 같은방식이죠.

BYTE read_buffer[BUFSIZE], write_buffer[BUFSIZE];

while(!eof) {
read data from file to read_buffer;
some operation(read_buffer -> write_buffer);
write data from write_buffer to another file or tmp file;
}

익명 사용자의 이미지

그방법도 써보았으나..
bufsize를 아주~~커다랗게 잡아야 하더군요..
그리고 그것도 일정치 않구요..만약 사이즈보다 더 큰 파일이 나오면 세그
멘테이션 에러가 발생..

익명 사용자의 이미지

어차피 큰파일도 버퍼링 문제가 아닐까 생각합니다...
연산을 버퍼단위로 나누면 문제가 없을 듯 싶은데...
전체 데이터를 굳이 메모리에 할당할 필요가 있을까요..
무척 비효율적으로 보이는데요...

제가 님의 질문을 잘못 이해한건지...ㅠ.ㅠ

가벼운 제 소견을 드리자면...

어차피 메모리를 파일의 크기에 따라 할당을 하게 된다고 가정하면

physical memory보다 파일 사이즈가 커지면 어파피 커널은

메모리부족을 해결하기위해 swapping을 하게 될텐데... ㅠ.ㅠ

어쨌든 이해안되는 질문이였습니다..

갑자기 궁금하네요.. 도대체 어떤 연산을 할건지???

만약 님의 말대로 파일사이즈도 일정하지 않고 가용버퍼를 크게 잡아야만

한다면...

버퍼사이즈를 줄이는 대신에 말씀하신 연산과정을 버퍼단위로 나누는것도

한 방법이 되겠군요. 어차피 덧셈뺄셈과같은 연산보다도 IO에 걸리는 시간

더욱 길거 같네요~

익명 사용자의 이미지

음 글쎄요...
님께서 버퍼링에 무슨 오해(?)내지는 이해(?)부족.. 혹은 저의 질문에 대
한 이해부족일수 있으나...

파일크기와 동일하게 메모리를 할당하는것은 상당히 비효율적이면서 실패
의 확률이 높습니다.

님께서는 질문에서 바이트단위(혹은 워드단위)로 데이터를 읽어
오퍼레이션후에 저장한다고 하셨는데, 그런경우에 과연
그 어마어마한(파일사이즈가 수기가가 되지 말라는법 없죠^^)메모리를
할당한다면 ... 글세요...
다시한번 정확한 질문이나 의견을 달아 주시길...

익명 사용자의 이미지

만일 읽은(변환되어야할) 데이터가 앞뒤의 데이터와 무관하게 연산이
되어진다면 무식하게 다음과 같이 할 수도 있겠죠.

handle1 = open ();
handle2 = open ();

while (1) {
if (eof (handle1)) break;
read (handle1, buf1, 1);
buf2 = buf1 연산;
write (handle2, buf2, 1);
}

-)

익명 사용자의 이미지


.. 님이 잘 말씀해 주신 듯 한데요?

.. 님께서 말씀하신 것은 파일을 통채로 처리하지 않고

루프를 돌면서 특정한 크기(bufsize) 만큼씩 읽어서 처리하라는

것이잖아요?

아마 딸기님이 세그 폴트 난 건 bufsize 만큼 읽는데서

문제가 난게 아닐까 하는데요.

버퍼를 잡으면 파일을 읽어올 때 버퍼를 넘지 않도록 읽게

보장을 해야할텐데요, read()를 쓰시든지, 문자열 처리라면

fgets() 를 쓰시든지..

여유치 않으시다면 mmap() 을 쓰셔서 메모리에 매핑해서

쓰시든가요.

이것도 .. 님께서 말씀해 주신 것 같은데..

파일 크기가 궁금하시다면 fstat() 등 stat 계열 함수를

이용해서 미리 알 수 있을테고요..

아님 다 귀찮으시면 perl 써 보시죠.. ㅡ.ㅡ

익명 사용자의 이미지


구냥 단순히 파일의 크기라면 fseek()을 이용하셔서...
file position indicator를 젤 뒤로 옮기시면 리턴값이 파일 크기입니다.
자세한건 맨페이지를 참고 하시구요..

화일이 넘 크다면 적절한(?) 방법으로 컨트롤을 하셔야 할겁니다..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.