Vertex(int number_of_vertex = -1, VertexDataType vertex_data = VertexDataType()) : number_of_vertex_(number_of_vertex), vertex_data_(vertex_data) {}
std::vector<vertex_value<VertexDataType> > get_top_vertices(std::string basefilename, int ntop, vid_t from=0, vid_t to=0) { typedef vertex_value<VertexDataType> vv_t; /* Initialize striped IO manager */ metrics m("toplist"); stripedio * iomgr = new stripedio(m); std::string filename = filename_vertex_data<VertexDataType>(basefilename); int f = iomgr->open_session(filename, true); size_t sz = get_filesize(filename); /* Setup buffer sizes */ int nverts = (int) (sz / sizeof(VertexDataType)); ntop = std::min(ntop, nverts); size_t bufsize = 1024 * 1024; // Read one megabyte a time int nbuf = (int) (bufsize / sizeof(VertexDataType)); bufsize = sizeof(VertexDataType) * nbuf; // Ensure that data type size divides bufsize assert(bufsize % sizeof(VertexDataType) == 0); /* Initialize buffer */ VertexDataType * buffer = (VertexDataType*) calloc(nbuf, sizeof(VertexDataType)); vv_t * buffer_idxs = (vv_t*) calloc(nbuf, sizeof(vv_t)); vv_t * topbuf = (vv_t*) calloc(ntop, sizeof(vv_t)); vv_t * mergearr = (vv_t*) calloc(ntop * 2, sizeof(vv_t)); /* Read the data and maintain the top-list */ size_t nread = 0; size_t offset = from * sizeof(VertexDataType); size_t endoff = (to > 0 ? to * sizeof(VertexDataType) : sz); size_t idx = 0; int count = 0; while (offset + nread < endoff) { size_t len = std::min(endoff - (offset + nread), bufsize); iomgr->preada_now(f, buffer, len, offset + nread); nread += len; int nt = (int) (len / sizeof(VertexDataType)); int k = 0; VertexDataType minima = VertexDataType(); if (count > 0) { minima = topbuf[ntop - 1].value; // Minimum value that should be even considered } for(int j=0; j < nt; j++) { if (count == 0 || (buffer[j] > minima)) { buffer_idxs[k] = vv_t((vid_t)idx + from, buffer[j]); k++; } idx++; } nt = k; /* How many were actually included */ /* Sort buffer-idxs */ quickSort(buffer_idxs, nt, vertex_value_greater<VertexDataType>); /* Merge the top with the current top */ if (count == 0) { /* Nothing to merge, just copy */ memcpy(topbuf, buffer_idxs, ntop * sizeof(vv_t)); } else { // void merge(ET* S1, int l1, ET* S2, int l2, ET* R, F f) { merge<vv_t>(topbuf, ntop, buffer_idxs, std::min(ntop, nt), mergearr, vertex_value_greater<VertexDataType>); memcpy(topbuf, mergearr, ntop * sizeof(vv_t)); } count++; } /* Return */ std::vector< vv_t > ret; for(int i=0; i < ntop; i++) { ret.push_back(topbuf[i]); } free(buffer); free(buffer_idxs); free(mergearr); free(topbuf); iomgr->close_session(f); delete iomgr; return ret; }