예제 #1
0
 Vertex(int number_of_vertex = -1, VertexDataType vertex_data = VertexDataType())
     : number_of_vertex_(number_of_vertex),
       vertex_data_(vertex_data) {}
예제 #2
0
파일: toplist.hpp 프로젝트: bmabey/graphchi
    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;
    }