在ubuntu下生成大檔案,並測試檔案讀寫效率

2021-08-25 04:59:17 字數 1792 閱讀 7951

在ubuntu或者其他的linux下生成大檔案,必須使用編譯引數-d_largefile_source -d_file_offset_bits=64.否則生成的檔案一定是2g左右的,原因是fseek,這個函式中的offset引數是乙個long型的或者是size_t型的,在fseeko中是off_t,但是這個off_t預設還是32位,只有加了

-d_file_offset_bits=64的巨集定義才被作為64位對待.

寫了下面一段**來生成大檔案,傳說有一種方法:直接跳轉ng位置之後,然後寫入乙個字元.這種方法可能更快,不過我為了保守的生成檔案,還是使用下面的乙個寫法:

#include#include#include#includevoid gen_file(const char *filename, int block_size, int count) buf = (char *)malloc(sizeof(char)*block_size); memset(buf,'1',sizeof(char)*block_size); while(i++

int block_size = 1024*1024*20; // 20m

這個是每次寫入的資料大小,gen_file("smallfile",block_size,count*2);第三個引數可以調節生成檔案的大小.

下面寫了乙個測試大檔案和小檔案的隨機讀寫和順序讀寫.

#include#include#include#include#include#include#include#includeconst int block_size = 8092; struct timeval start; struct timeval end; struct timezone tz; void start_time() void end_time() void print_time() size_t look_size(const char * filename) void read_blocks(file* file, off_t offset,int block_size) file* fopen_safe(const char * filename) return file; } void random_read(const char * filename) void order_read(const char *filename,int order) void random_test(const char * filename,int times){ int count = 0; start_time(); while(count++當然你這裡做測試的時候可以把gettimeofday替換為clock()或者time()函式,其中clock()是程式實際執行的時間,你感覺可能執行了七八秒,其實程式只占用cpu執行了1秒.如果是time()函式或者gettimeofday()函式就是真正的執行時間也就是你感覺執行的時間.所以各有千秋,前者是為了排除各種執行環境中的軟體或者os的不同,單獨檢測程式的效率.後者是在系統環境中程式的執行時間.

下面是我得到的結論,建立1個10g檔案,建立3個2g小檔案.

大檔案 隨機訪問7.199645 sec

大檔案 順序訪問0.013617 sec

單個小檔案 隨機訪問5.119245 sec

小檔案 順序訪問0.014190 sec

多個小檔案的隨機訪問測試:90%的機率訪問同乙個小檔案,6%訪問兩個小檔案,4%訪問3個小檔案 9.791248 sec.並且90%機率發生在前,所以如果隨機發生多個檔案的隨機訪問,那麼可能速度會更慢.這裡慢的原因,是因為fopen.

這也就是資料庫為什麼只有乙個資料檔案的原因.有時進行檔案切分,反而不利於效率的提高.但是對於100g以上的大檔案,是否這個結論又要改變了呢?我沒有做過這個實驗.

解決Pycharm在C盤下生成大檔案問題

我個人有強迫症,上次在整理c盤時,無意間發現了乙個這樣的檔案 在我的使用者目錄下,有個.pycharm2019.3這樣的資料夾,我猜想和pycharm可能有什麼py關係 那這個檔案有多大呢,來操作一下 霧草,竟然0.5個g了,我才剛用沒多久唉 這對於我這強迫症來說很難受哎,螞蟻在我心上爬 裡面會有一...

linux快速生成大檔案

dd命令可以輕易實現建立指定大小的檔案,如 dd if dev zero of test bs 1m count 1000 會生成乙個1000m的test檔案,檔案內容為全0 因從 dev zero中讀取,dev zero為0源 但是這樣為實際寫入硬碟,檔案產生速度取決於硬碟讀寫速度,如果欲產生超大...

java生成大檔案的示例

生成ngb的資料檔案的方法,n是自然數,對應不同的檔案大小。1.生成檔案的方法 private static void writefile int n system.out.println writefile start randomaccessfile file null try file new...