@@ -59,61 +59,94 @@ SEXP FARR_subset_sequential(
5959 std::string fbase = correct_filebase (filebase);
6060 R_len_t nparts = Rf_length (cum_partsizes);
6161
62- // calculate the first partition
62+ // calculate the first partition, should start from 1
6363 int64_t slice_idx1 = 0 ;
64+
65+ // partition number cannot go beyond nparts + 1 (can equal)
6466 int64_t slice_idx2 = 0 ;
6567 int64_t tmp = 0 ;
68+
69+ // Rcout << "From: " << from << " - len: " << len << " nparts: " << nparts << "\n";
6670 for (; tmp <= from; tmp+= unit_partlen, slice_idx1++){}
67- for (slice_idx2 = slice_idx1; tmp < from + len; tmp+= unit_partlen, slice_idx2++){}
68- // Rcout << slice_idx1 << " - " << slice_idx2 << "\n";
6971
72+ for (slice_idx2 = slice_idx1; tmp < from + len && slice_idx2 < nparts; tmp+= unit_partlen, slice_idx2++){}
73+
74+ // Rcout << "Starting from partition: " << slice_idx1 << " - ends before: " << slice_idx2 << "\n";
75+
76+ // Which partition to start: min = 0
7077 int part_start = 0 ;
7178 int part_end = 0 ;
7279 int64_t skip_start = 0 ;
73- int64_t skip_end = 0 ;
80+ // int64_t skip_end = 0;
7481
7582 int64_t * cum_part = INTEGER64 (cum_partsizes);
76- for (; slice_idx1 > *cum_part; cum_part++, part_start++){}
83+ for (; *cum_part < slice_idx1 ; cum_part++, part_start++){}
7784 if ( part_start == 0 ){
7885 skip_start = from;
7986 } else {
8087 skip_start = from - (*(cum_part - 1 )) * unit_partlen;
8188 }
82- for (part_end = part_start; slice_idx2 > *cum_part; cum_part++, part_end++){}
83- skip_end = (*cum_part) * unit_partlen - (from + len);
89+ for (part_end = part_start; *cum_part < slice_idx2; cum_part++, part_end++){}
90+ // if(part_end == 0) {
91+ // skip_end = unit_partlen - (from + len);
92+ // // Rcout << part_start << " " << part_end << " " << *cum_part << std::endl;
93+ // } else {
94+ // skip_end = (*(cum_part - 1)) * unit_partlen - (from + len);
95+ // // Rcout << part_start << " " << part_end << " " << *(cum_part-1) << std::endl;
96+ // }
97+ // // This happens when buffer size is longer than array length
98+ // if(skip_end < 0) {
99+ // skip_end = 0;
100+ // }
101+
102+ // Rcpp::print(cum_partsizes);
103+
84104
85105 // Rcout << part_start << " - " << part_end << "\n";
86106 // Rcout << skip_start << " - " << skip_end << "\n";
87107
88108 int64_t read_start = 0 ;
89109 int64_t read_len = 0 ;
90110 int64_t part_nelem = 0 ;
91- int64_t last_part_nelem = 0 ;
92- cum_part = INTEGER64 (cum_partsizes);
111+ cum_part = INTEGER64 (cum_partsizes) + part_start;
93112
94113 int64_t nread = 0 ;
95114
96115 const boost::interprocess::mode_t mode = boost::interprocess::read_only;
97116
117+
98118 for (int part = part_start; part <= part_end; part++, cum_part++, nread += read_len){
99119 if ( part >= nparts ){
100120 continue ;
101121 }
102122 // get partition n_elems
103- part_nelem = (*cum_part) * unit_partlen - last_part_nelem;
104- last_part_nelem = (*cum_part) * unit_partlen;
123+ if (part == 0 ) {
124+ part_nelem = (*cum_part) * unit_partlen;
125+ } else {
126+ part_nelem = (*cum_part - *(cum_part - 1 )) * unit_partlen;
127+ }
128+ // Rcout << "Starting with " << *cum_part << ", current partition contains elements: " << part_nelem << "\n";
129+
105130
106131 // skip read_start elements
107- read_start = 0 ;
108132 if ( part == part_start ) {
109133 read_start = skip_start;
134+ } else {
135+ read_start = 0 ;
110136 }
111- // Rcout << part_nelem << "--\n";
112- // then read read_len elements
113137 read_len = part_nelem - read_start;
114- if ( part == part_end ) {
115- read_len -= skip_end ;
138+ if ( read_len > len - nread ) {
139+ read_len = len - nread ;
116140 }
141+ // Rcout << "n read: " << nread << ", plan to read more: " << read_len << " from " << read_start << "\n";
142+
143+ // Rcout << part_nelem << "--\n";
144+ // then read read_len elements
145+ // if( part == part_end ){
146+ // read_len -= skip_end;
147+ // }
148+
149+ // Rcout << "reading from partition: " << part << "\n";
117150
118151 std::string part_file = fbase + std::to_string (part) + " .farr" ;
119152
0 commit comments