大量資料查重

2021-08-26 12:54:25 字數 1735 閱讀 7752

本來到軟工所是為了做作業和看書的,結果,很不務正業的被乙個問題吸引了,這個任務是:從檔案中讀入一系列格式化好的資料,如

int           int              int        int     float     float

90900 1442373573 1486014884 0 0.0125 0.0949473

90900 1442373573 1485883012 0 0.0125 0.0945844

90900 836615420 1488523911 2 0.0125 0.00650644

90900 1277583173 1488377356 3 0.0125 0.089611

90900 598391375 1488217313 2 0.0125 0.00790251

90900 1277583173 1306110622 3 0.0125 0.10079

90900 1277583173 1294971886 3 0.0125 0.0947241     

然後以某個資料為key進行查重(一看發現第一排都一樣),思路其實相當簡單,在輸入資料的時候構建hash表或者樹形查詢結構(直接使用stl的set或者map即可)資料量很大,大約150m以上的資料。 所以其實最大的問題在於怎麼做檔案操作才可以盡可能快的完成,考慮到150m內存放的下,而傳統的一次讀取乙個資料或者一次一行的操作都要頻繁的io操作,效能必然達不到要求,所以需要一次性將整個檔案讀入記憶體,然後再對記憶體中的格式化資料進行處理。

格式化讀入資料我用的是sscanf不知道c++有沒其他好的方法,至少我感覺同時使用c++的io庫和c的庫是件非常蛋疼的事情,經常會發生各種莫名其妙的錯誤,還是少用為好。但c++標準的io庫的效率實在是。。。如果不優化絕對滿足不了要求的。以前搞acm的時候的教條,如果你不想timeout,那就不要用cin,cout。學學scanf和printf吧,少年。記憶尤深啊。

如果記憶體限制的情況就是盡可能的分割塊來求解了,如果僅僅是查重的話,說明重複的數量必然不大,查重的資料結構可以常駐記憶體。只需要把io讀寫的操作考慮清楚就ok了。

在string 的substr上面糾結了很久,因為我的印象中是傳入兩個引數,乙個是開始索引,另乙個是結束的。。所以該函式的行為讓我很不解,後面一除錯發覺不對勁,結果查了下,才發現居然第二個引數是擷取的字元數。。。記性不好啊。。確實應該多寫才行,string 處理在大三暑假做課程設計時候經常用的,兩年多了就忘的差不多了。

不多扯了,**如下:

#include#include #include #include#include using namespace std;

//the google data structure

struct data

;//store the data into a vector

typedef vectorgoogle_data;

void initdata(const string& s_data, google_data& t_data)

cout<<"the total lines:"pbuf->pubseekpos(0, ios::in);

//分配記憶體空間

buffer = new char[size];

//獲取檔案內容

pbuf->sgetn(buffer, size);

filestr.close();

return buffer;

}int main()

Salesforce 記錄資料查重

使用方法 objectapiname 物件api名稱 newlist 要新增的資料 oldlist 要對比的老資料 注意 newlist和oldlist的泛型必須是同一sobjecttype 對比的字段只包含自定義字段 如果有重複則會return newlist中乙個sobject public s...

MySQL 資料查重 去重的實現語句

有乙個表user,字段分別有id nick name password email phone。一 單字段 nick name 查出所有有重覆記錄的所有記錄 select from user where nick name in select nick name from user group by...

線性表 資料查重演算法

線性表是計算機最常見的一種資料結構.記錄檔案,陣列,作業系統的程序佇列等都是這種資料結構,它們或者用順序儲存結構,或者用鏈儲存結構.下面介紹都是基於線性表的應用 資料查重是檢視乙個線性表中資料元素或其組成的資料項是否重複儲存為多個結點.所線性表的儲存結構不同,查重演算法也不同 查重的目的不同,演算法...