線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3431
推到 Plurk!
推到 Facebook!

BCB buffer 大小?

答題得分者是:ddy
kk_9951
一般會員


發表:5
回覆:3
積分:1
註冊:2006-08-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-30 14:41:33 IP:114.36.xxx.xxx 訂閱
BCB 有限制開啟 buffer 大小嗎?

byte DataBuffer[32*1024*1024]; // 32Mbyte buffer <= OK
byte DataBuffer[1024*1024*1024]; // 1Gbyte buffer <= error
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-30 15:43:54 IP:115.43.xxx.xxx 訂閱
byte DataBuffer[32*1024*1024];         // 32Mbyte buffer 
為何是 32Mbyte buffer
不是 32GB 1 byte ??
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
kk_9951
一般會員


發表:5
回覆:3
積分:1
註冊:2006-08-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-30 17:12:14 IP:114.36.xxx.xxx 訂閱

===================引 用 AndrewK 文 章===================
byte DataBuffer[32*1024*1024]; // 32Mbyte buffer
為何是 32Mbyte buffer
不是 32GB 1 byte ??




1K = 1024 Byte
1M = 1K * 1K = 1024*1024
32M = 32 * 1M = 32* 1024*1024
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-30 19:33:58 IP:115.43.xxx.xxx 訂閱
忘了 k 的存在  QQ

stack over flow
超過 stack 所能容納的大小

可以宣告動態二維或動態三維來解決
不使用 stack 而用 heap 來解決
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-07-30 19:36:47, 註解 無‧
AndrewK 重新編輯於 2009-07-30 19:39:00, 註解 無‧
AndrewK 重新編輯於 2009-07-30 19:59:23, 註解 無‧
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-07-31 10:03:10 IP:59.124.xxx.xxx 訂閱
AndrewK 說的對
但是…我很好奇的是…是什麼資料要用到 1G 的buffer 空間
記憶體是很便宜啦…但是這樣的做法個人是覺不妥
考慮 memory-mapped file 吧

===================引 用 kk_9951 文 章===================
BCB 有限制開啟 buffer 大小嗎?

byte DataBuffer[32*1024*1024]; // 32Mbyte buffer <= OK
byte DataBuffer[1024*1024*1024]; // 1Gbyte buffer <= error
kk_9951
一般會員


發表:5
回覆:3
積分:1
註冊:2006-08-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-08-03 17:12:42 IP:114.36.xxx.xxx 訂閱
memory-mapped file 如何使用?
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-08-05 10:45:12 IP:122.147.xxx.xxx 訂閱
MSDN 搜尋這些keyword 就有詳細說明,google 也能找到example
CreateFileMapping
MapViewOfFile
UnmapViewOfFile

ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-08-05 11:25:03 IP:122.147.xxx.xxx 訂閱
好吧,寫了小範例給你看…我承認~~~看那一堆MSDN文件很痛苦…所以還是寫了小範例
但是至少你要做的功課就是看懂,並且了解每一個參數與常數的函意
很快就能運用自如了
[code cpp]

void __fastcall TForm1::Button2Click(TObject *Sender)
{//建立測試文字檔
FILE *fp;
unsigned int count = 1000 * 1000 * 1000;
fp = fopen("C:\\text.txt","w");
for (int i=0;i {
char c = 'A' (i&);
fprintf(fp,"%c",c);
if (c == 'Z')
{
fprintf(fp,"\n");
}
Application->ProcessMessages();
}
fclose(fp);
ShowMessage("Create text.txt ok") ;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
//建立
HANDLE hFile = CreateFile("C:\\text.txt",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
ShowMessage("File open fail);
return;
}


unsigned long fileSize = GetFileSize(hFile,NULL);
HANDLE hMap = CreateFileMapping (hFile,
NULL,
PAGE_READWRITE,
0,
fileSize 1,
NULL);
if (hMap == NULL)
{
ShowMessage("Create File mapping fail");
CloseHandle(hFile);
return;
}

void *mvFile = MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
if (mvFile == NULL)
{
ShowMessage("Mapping fail");
CloseHandle(hMap);
CloseHandle(hFile);
return;
}
//操作
char *mem = (char*)mvFile;
for (int i=0;i<10000;i )
{
if (isupper(mem[i]))
mem[i] = tolower(mem[i]);
else
mem[i] = toupper(mem[i]);
}
//Close file mapping
UnmapViewOfFile(mvFile);
CloseHandle(hMap);
CloseHandle(hFile);
ShowMessage("ok");
}


[/code]
這個範例裡,我事先以程式產生1000MB 的文字檔,內容由A到Z
以memory-mapped file 讀入後,並改變大小寫,你可以觀察用buffer讀入的方式與memory-mapped file 的方式在時間上的差別
編輯記錄
ddy 重新編輯於 2009-08-05 11:34:55, 註解 無‧
ddy 重新編輯於 2009-08-05 11:47:20, 註解 無‧
系統時間:2024-04-26 1:23:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!