部分代碼:class ChunkInfo{public:char *buffer_address;//內存塊的地址long realsize;//內存塊的大小ChunkInfo(){}ChunkInfo(char *buffer,long size){this->realsize = size;this->buffer_address = buffer;}};list<ChunkInfo> CHUNK_INFO_LIST;ifstream in;in.open(inpath.c_str(),ios::in|ios::binary|ios::ate);ifstream::pos_type size = in.tellg();in.seekg(0,ios::beg);//指針回到頭部//如果文件大小大于1.5GB就分塊讀取,每塊設置大小1.5GB,并把信息構造在ChunkInfo中,然后保存在list里。if(size>MAX_SIZE_BIT){cout<<"A"<<endl;while(in.good()){cout<<in.tellg()<<endl;//第一次循環正常,到第二次的時候就在這出錯了char *chunk_buffer = new char[CHUNK];in.read(chunk_buffer,CHUNK);long real_size = (long)in.gcount();ChunkInfo chunk(chunk_buffer,real_size);CHUNK_INFO_LIST.push_back(chunk);}in.close();}
2 回答

Qyouu
TA貢獻1786條經驗 獲得超11個贊
C++自己的流API似乎不支持,必須使用操作系統提供的api
如果是windows,應該使用file mapping相關的api,看CreateFileMapping之類函數的MSDN說明吧
即使不大于2G在絕大部分情況下,大于1.5G放內存都是不可能的。缺省C++api使用的是堆,而堆的內存塊是很小的。分配給用戶端的內存總共才2G,其中很多還要分配給系統和代碼。如果逆要使用超過幾百M的內存,就需要好好研究虛擬內存系統,不能直接指望C++API了

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
大文件可以被一部分一部分地讀,這在windows里被以虛擬內存映射文件的方式實現。而不能用其本身的文件流,因為它自己是調用系統API實現的,而又缺少參數,便保險地映射全部文件到內存,而一般系統的虛擬地址空間為用戶2G,服務器上才3G。而2G里顯然要包括程序文件本身與環境子系統DLL們。所以剩下不足2G了,這下就不夠用了,所以不能用C++里的文件流。用windows系統自帶的API函數可以實現分塊映射讀取,當然讀完一塊要釋放掉,不然最后還是不夠用,這樣就行了,你可以看書去了。
- 2 回答
- 0 關注
- 231 瀏覽
添加回答
舉報
0/150
提交
取消