수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1620663
  • Today | 43
  • Yesterday | 482

Programming/MFC2007/03/21 09:57

대용량의 파일 순식간에 읽기

원본 : http://www.debuglab.com/knowledge/largefileread.html

1.요약

10M 이상이 되는 파일을 빠르게 읽는 방법을 알아보기로 합니다.


2.본문

<대용량 파일 읽기 (빠르게...)>
v 파일 읽기는 자주 사용하실 것인데.. CFile::Read를 사용하면.. 10MB정도 되는 파일을 읽으면 무진장 오래 걸려서.. 메모리 맵 파일을 이용한 파일 읽기 방법을 올려 들립니다..

많은 예제가 나온것으로 알지만.. 혹시... 도 몰라서..


BOOL OpenFiles(LPCSTR lpszPathName) 

{ 

    DWORD dwFileSize; 

    HANDLE hFile, hFileMap; 

    LPVOID lpvFile; 

    

    hFile = ::CreateFile(lpszPathName, GENERIC_READ , 0, NULL 

        OPEN_EXISTING, FILE_ATTRIBUTTE_NORMAL, NULL); 

    if(hFile == INVALID_HANDLE_VALUE) { 

        //여기에서 에러 메세지 처리.. 

    } 

    dwFileSize = ::GetFileSize(hFile, NULL); 

    

    hFileMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 

        dwFileSize, NULL); 

    

    if(hFileMap == NULL) { 

        CloseHandle(hFile); 

        //여기에서 에러 메세지 처리.. 

    } 

    

    lpFile = MapViewOfFile(hFileMap, FILE_MAP_COPY, 0,0,0); 

    

    if(lpFile == NULL) { 

        CloseHandle(hFile); 

        CloseHandle(hFileMap); 

        //여기에서 에러 처리 

    } 

} 

이렇게 하면.. 대용량의 파일을 빠르게 읽을 수 있습니다..

제가 시간을 한번 제어 봤는데.. 4초 안에 끊나더군요..

흠.. 그리고 여기에 나온 함수는 Help에서 정확한 내용을 보세요.

.
<대용량 파일 빠르게 읽기 2>

메모리 맵파일을 이용한 방법외에 간단한 방법이 있어서 말씀드려볼까 합니다.

어려운 루틴은 아니고요, 그냥 도스용 시절에 사용했던 fread함수를 사용한 것입니다.

물론 fread대신 다른 파일 읽기 함수를 사용해도 됩니다.

다만 사용자 편의를 위해서 추가로 만들어진 파일함수들은(파일함수뿐만 아니라 다른 것들도 마찬가지...) 사용하긴 편하겠지만, 속도가 무척 느린 문제가 있습니다.

char *ReadFile( char *FileName ) 

{ 

    FILE *fp; 

    int FileSize; 

    char *buffer; 

    

    try { 

        fp = fopen( FileName, "rb" ); 

        if( !fp ) throw "File Not Found!"; 

        

        FileSize = filelength( fileno(fp) ); 

        buffer = new char [FileSize+1]; 

        fread( buffer, FileSize, 1, fp ); 

        *(buffer + FileSize) = 0; 

        fclose( fp ); 

        return buffer; 

    } 

    catch( char *msg ) { 

        printf( msg ); 

        return NULL; 

    } 

} 

위의 try ~ catch구분은 중요한것은 아니고요, 대부분의 프로그래머분들이 예외처리를 함에 있어서 일반적인 C스타일로 일일히 에러메시지를 코딩하더군요.

그래서 혹시나 도움이 될까 해서 try ~ catch구분을 사용해보았습니다. 어려운건 아니니깐 try ~ catch를 사용하면 코딩이 훨씬 간단해질꺼예요. ^^

그리고 위의 파일읽기 함수를 fopen/fread등을 사용했는데, 이건 C를 시작하는 분들 께 조금이나마 이해가 쉽도록 도스에서 사용하던 함수를 사용했습니다. 물론 이 함수들은 윈도우즈에서도 그대로 사용할수 있습니다.

원래 도스에서 fread는 한블럭최대크기가 64k로 제한됩니다.

따라서 64k씩 나누어서 파일을 읽어들여야 하는데, 윈도우즈에서는 그냥 한번에 읽을 수 있더군요. ^^

10메가 정도 읽어들이는데 있어서, 펜133의 컴에서 약 3초미만으로 걸리는 것 같습니다.



- 2001.08.13 Smile Seo -

"MFC" 카테고리의 다른 글
  • Delayload 적용시키기 (0)2007/03/21
  • MFC 라이브러리에 동적으로 링크된 정규 DLL (0)2007/03/21
  • 대용량의 파일 순식간에 읽기 (0)2007/03/21
  • Edit 컨트롤에서 Tab 키 넣기 (0)2007/03/21
  • GUID 생성하기 (0)2007/03/21
2007/03/21 09:57 2007/03/21 09:57
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2717

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 521 522 523 524 525 526 527 528 529 ... 2998  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 올블로그
  • 동물자연과학대학
  • 유저 정보
  • char
  • CView
  • Kprobes
  • 백령문화관
  • exception
  • nmap
  • 장르
  • ActionScript
  • 산림환경과학대학
  • Volatile
  • Objects
  • 퇴계관
  • eyeOS
  • 락
  • Accessiblity
  • 정치
  • Symbol

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.