Commit | Line | Data |
---|---|---|
56857861 BA |
1 | #data: matrix of double or connection |
2 | serialize = function(data_ascii, data_bin_file, nb_per_chunk, | |
3 | sep=",", nbytes=4, endian=.Platform$endian) | |
4 | { | |
5 | if (is.character(data_ascii)) | |
6 | data_ascii = file(data_ascii, open="r") | |
7 | else if (is(data_ascii,"connection") && !isOpen(data_ascii)) | |
8 | open(data_ascii) | |
9 | ||
10 | first_write = (!file.exists(data_bin_file) || file.info(data_bin_file)$size == 0) | |
11 | data_bin = file(data_bin_file, open=ifelse(first_write,"wb","ab")) | |
12 | ||
13 | #write data length on first call | |
14 | if (first_write) | |
15 | { | |
16 | #number of items always on 8 bytes | |
17 | writeBin(0L, data_bin, size=8) #,endian="little") | |
18 | if (is.matrix(data_ascii)) | |
19 | data_length = ncol(data_ascii) | |
20 | else #if (is(data, "connection")) | |
21 | { | |
22 | data_line = scan(data_ascii, double(), sep=sep, nlines=1, quiet=TRUE) | |
23 | writeBin(data_line, data_bin, size=nbytes) | |
24 | data_length = length(data_line) | |
25 | } | |
26 | } | |
27 | ||
28 | if (is.matrix(data_ascii)) | |
29 | index = 1 | |
30 | repeat | |
31 | { | |
32 | if (is.matrix(data_ascii)) | |
33 | { | |
34 | range = index:min(nrow(data_ascii),index+nb_per_chunk) | |
35 | data_chunk = | |
36 | if (range[1] <= nrow(data_ascii)) | |
37 | as.double(t(data_ascii[range,])) | |
38 | else | |
39 | integer(0) | |
40 | index = index + nb_per_chunk | |
41 | } | |
42 | else | |
43 | data_chunk = scan(data_ascii, double(), sep=sep, nlines=nb_per_chunk, quiet=TRUE) | |
44 | if (length(data_chunk)==0) | |
45 | break | |
46 | writeBin(data_chunk, data_bin, size=nbytes) | |
47 | } | |
48 | ||
49 | if (first_write) | |
50 | { | |
51 | #ecrire file_size-1 / (nbytes*nbWritten) en 0 dans bin_data ! ignored == file_size | |
52 | ignored = seek(data_bin, 0) | |
53 | writeBin(data_length, data_bin, size=8) | |
54 | } | |
55 | close(data_bin) | |
56 | ||
57 | if (is(data_ascii,"connection")) | |
58 | close(data_ascii) | |
59 | } | |
60 | ||
61 | #read in binary file, always same structure | |
62 | getDataInFile = function(indices, data_bin_file, nbytes=4, endian=.Platform$endian) | |
63 | { | |
64 | data_bin = file(data_bin_file, "rb") | |
65 | data_length = readBin(data_bin, "integer", 1, 8, endian) | |
66 | #Ou t(sapply(...)) (+ rapide ?) | |
67 | data_ascii = do.call( rbind, lapply( indices, function(i) { | |
68 | ignored = seek(data_bin, 8+((i-1)*data_length*nbytes)) | |
69 | readBin(data_bin, "double", n=data_length, size=nbytes) | |
70 | } ) ) | |
71 | close(data_bin) | |
72 | data_ascii | |
73 | } |