Notepad++ 打開大檔案非常快,是怎么做到的?
為啥咱自己寫程式的打開個幾 M 的都挺慢的。。。
uj5u.com熱心網友回復:

他應該不是一次讀取全部。所以快。
uj5u.com熱心網友回復:
打開幾M的也慢?那說明你寫的程式有問題。
應當說,記事本打開一個幾M的檔案很慢。
知道為什么嗎?因為記事本做了很多作業。自動判斷編碼,自動判斷語言等等。
所以記事本才會慢。
如果這些作業都不做,那么以現在電腦的速度,打開一個百兆內的檔案,即使全部加載到記憶體里面也是很快的。
uj5u.com熱心網友回復:
那應該怎么寫呢?uj5u.com熱心網友回復:
他應該不是一次讀取全部。所以快。
uj5u.com熱心網友回復:
那應該怎么寫呢?
正常寫啊。。。
我很奇怪,你的打開幾M檔案很慢的代碼是怎么寫的。
uj5u.com熱心網友回復:
有界面啊,用的Qt,QFile f;
f.open(QIODevice::ReadOnly);
while(f.read(buff, size))
...
uj5u.com熱心網友回復:
那應該怎么寫呢?
正常寫啊。。。
我很奇怪,你的打開幾M檔案很慢的代碼是怎么寫的。
有界面啊,用的Qt,
QFile f;
f.open(QIODevice::ReadOnly);
while(f.read(buff, size))
...
uj5u.com熱心網友回復:
有界面啊,用的Qt,
QFile f;
f.open(QIODevice::ReadOnly);
while(f.read(buff, size))
...
你的buffer有多大?
有沒有用檔案映射?
不用檔案映射,你可以獲取檔案的屬性,得到檔案大小,申請和檔案大小相同的記憶體,一條陳述句讀完。沒必要回圈讀取。
uj5u.com熱心網友回復:
有界面啊,用的Qt,
QFile f;
f.open(QIODevice::ReadOnly);
while(f.read(buff, size))
...
你的buffer有多大?
有沒有用檔案映射?
不用檔案映射,你可以獲取檔案的屬性,得到檔案大小,申請和檔案大小相同的記憶體,一條陳述句讀完。沒必要回圈讀取。
buff 從幾百K到1M,都試過。
一條陳述句讀完? readAll() 就是吧?并不快啊。這里應該不是關鍵
跑題了,還是想知道Notepad++ 為什么那么快?記憶體映射?
uj5u.com熱心網友回復:
buff 從幾百K到1M,都試過。
一條陳述句讀完? readAll() 就是吧?并不快啊。這里應該不是關鍵
跑題了,還是想知道Notepad++ 為什么那么快?記憶體映射?
開源的可以看原始碼啊。
我覺得只是正常速度啊。沒有快啊。
反倒是你說的慢,我覺得非常奇怪。
uj5u.com熱心網友回復:
現在硬碟的讀速度一般可以達到幾百M每秒,每一次讀取的size只要大于64k,一般速度都會差不多,但是,要使用快取的方式打開檔案,否則,沒有快取就會慢很多,你看你打開檔案的方式是不是有快取,而且是順序方式讀取uj5u.com熱心網友回復:
不快。你打開個100M的txt,肯定也是要時間的。這里牽扯到一個問題,就是換行。winHex 打開文本檔案、拖動也很快,因為它可以隨機讀取,按照一屏多少位元組SEEK就完了。文本編輯器,就難了,因為不知道一行有多少字符。所以,如果有一款打開1GB的TXT檔案很快的編輯器,一定是只讀開始的幾個螢屏。這種編輯器如果進度條拖動一下,估計也會慢。
一種利用視覺錯覺的超大TXT瀏覽方法是這樣的:
1、打開檔案時,從檔案的隨機10個位置各讀取少量資料,而后統計平均每行的字符數K。
2、讀取首螢屏,顯示,秒出。
3、用戶拖動進度條時,直接用K作為單位,SEEK到檔案位置,預讀N字符(如1MB)。
4、向上尋找第一個換行符,作為本螢屏的首行,而后依次顯示各行。
這種方法導致進度條不是很精確,且無法顯示當前是檔案的多少行。
再智能一些,后臺可維護一個執行緒,優先級低一些,從頭索引換行符。記錄每頁換行符的位元組位置(按100換行符一頁)。而后利用這個索引,就會快的多。
uj5u.com熱心網友回復:
大檔案(上G)要做記憶體檔案映射;和現在的電腦快慢沒有關系;現在電腦cpu,記憶體是夠快,慢的是磁盤io;所以還是慢;
不過試過NOTEPAD++ 打開很大的文本檔案還是會有明顯的卡頓;
拖動滾動條的時候很明顯;
可能有預讀取前面一些資料,并沒有一次性全部讀取并展示。
uj5u.com熱心網友回復:
也沒很快吧。幾百M的日志檔案,看著似乎是全部讀取了,實際上滾動條在動的。你可以試試剛打開檔案那會兒,拖一下滾動條試試,卡的一Buj5u.com熱心網友回復:
你咋知道他讀完了的呀。反正電腦速度碾壓人類反應速度。后臺閑著加載。前面你要看啥稍微騰點時間陪你意思意思以下就好了。
uj5u.com熱心網友回復:
而且我發現我的notepad不知為什么不能搜索:TEST 這個字串uj5u.com熱心網友回復:
而且我發現我的notepad不知為什么不能搜索:TEST 這個字串

uj5u.com熱心網友回復:
有界面啊,用的Qt,
QFile f;
f.open(QIODevice::ReadOnly);
while(f.read(buff, size))
...
應當是這個類帶有了序列化的功能。
我用VS的CArchive序列化,讀取一個80M的檔案,結果好慢。
我直接用檔案讀取80M的檔案,并顯示出來,秒完,讀取,顯示,總共花費不到1秒。
所以建議自己撰寫序列化操作。
CFile *pCFile;
char *pBuffer;
unsigned int size;
//ar.ReadString(m_conent); // 超慢,無法忍受
{ // 自己讀取
pCFile = ar.GetFile();
size = pCFile->GetLength();
pBuffer = new char[size + 2];
ZeroMemory(pBuffer, size + 2);
pCFile->Read(pBuffer, size);
m_conent = pBuffer;
}
uj5u.com熱心網友回復:
而且我發現我的notepad不知為什么不能搜索:TEST 這個字串
啊,我終于發現了。我搜索的時候勾了全詞匹配所以搜不到
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20696.html
標籤:C++ 語言
