29 #ifndef DEF_GRAPHCHI_TOPLIST
30 #define DEF_GRAPHCHI_TOPLIST
38 #include "util/merge.hpp"
40 #include "util/qsort.hpp"
45 template <
typename VertexDataType>
53 template <
typename VertexDataType>
55 return a.value > b.value;
67 template <
typename VertexDataType>
68 std::vector<vertex_value<VertexDataType> >
get_top_vertices(std::string basefilename,
int ntop) {
70 std::string filename = filename_vertex_data<VertexDataType>(basefilename);
71 int f = open(filename.c_str(), O_RDONLY);
73 logstream(
LOG_ERROR) <<
"Could not open file: " << filename <<
74 " error: " << strerror(errno) << std::endl;
75 return std::vector<vertex_value<VertexDataType> >();
77 size_t sz = lseek(f, 0, SEEK_END);
81 ntop = std::min(ntop, nverts);
83 size_t bufsize = 1024 * 1024;
90 vv_t * buffer_idxs = (vv_t*) calloc(nbuf,
sizeof(vv_t));
91 vv_t * topbuf = (vv_t*) calloc(ntop,
sizeof(vv_t));
92 vv_t * mergearr = (vv_t*) calloc(ntop * 2,
sizeof(vv_t));
99 size_t len = std::min(sz - nread, bufsize);
100 preada(f, buffer, len, nread);
107 minima = topbuf[ntop - 1].value;
109 for(
int j=0; j < nt; j++) {
110 if (count == 0 || (buffer[j] > minima)) {
111 buffer_idxs[k] = vv_t((vid_t)idx, buffer[j]);
119 quickSort(buffer_idxs, nt, vertex_value_greater<VertexDataType>);
124 memcpy(topbuf, buffer_idxs, ntop *
sizeof(vv_t));
127 merge<vv_t>(topbuf, ntop, buffer_idxs, std::min(ntop, nt), mergearr, vertex_value_greater<VertexDataType>);
128 memcpy(topbuf, mergearr, ntop *
sizeof(vv_t));
135 std::vector< vv_t > ret;
136 for(
int i=0; i < ntop; i++) {
137 ret.push_back(topbuf[i]);