Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / dataaccess / cache / CacheStruct.java @ 10960

History | View | Annotate | Download (13.4 KB)

1

    
2
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
3
 *
4
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 */
20
package org.gvsig.raster.dataaccess.cache;
21

    
22
import org.gvsig.raster.RasterLibrary;
23
import org.gvsig.raster.dataset.IBuffer;
24

    
25
/**
26
 * Esta clase representa la estructura en memoria de la cache. Contiene el n?mero de p?ginas 
27
 * as? como los subconjuntos en las que se divide. Tendr? tambi?n datos como en ancho y alto de
28
 * cada p?gina y tama?o en memoria de esta. 
29
 * 
30
 * @author Nacho Brodin (nachobrodin@gmail.com)
31
 *
32
 */
33
public class CacheStruct{
34
        //******************* PARAMETERS ***************************
35
        /**
36
         * Tama?o aproximado de cach? en Megas. Si este valor es alto cabr?n muchas p?ginas en memoria 
37
         * a la vez y si es bajo cabr?n pocas. Hay que tener en cuenta que al instanciar se convertira en bytes
38
         * para su mejor tratamiento. Al llamar al constructor esta variable contendr? el tama?o exacto
39
         * de la cache en bytes. El tama?o aqu? especificado es aproximado. Este variar? dependiendo de los
40
         * par?metros del raster a cachear ya que las p?ginas deben tener una altura potencia de 2.
41
         */
42
        private long cacheSize = RasterLibrary.cacheSize;
43
        /**
44
         * Tama?o m?ximo de la p?gina en Megas. Hay que tener en cuenta que al instanciar se convertira en bytes
45
         * para su mejor tratamiento. Al llamar al constructor esta variable contendr? el tama?o exacto
46
         * de la p?gina en bytes
47
         */
48
        private double pageSize = RasterLibrary.pageSize;
49
        /**
50
         * N?mero de p?ginas que tiene cada conjunto
51
         */
52
        private int pagsPerGroup = RasterLibrary.pagsPerGroup;
53
        //****************** END PARAMETERS ************************
54
                
55
        private int[] possibleHeights = {2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536};
56
                
57
        /**
58
         * Altura de la p?gina de cada banda en l?neas.
59
         */
60
        private int hPag = 1;
61
        /**
62
         * Para extraer el desplazamiento de una direcci?n (l?nea de raster) hay que hacer una operaci?n And con 
63
         * con la altura de la p?gina -1. Por ejemplo, una p?gina de 16 l?neas de altura el desplazamiento ser?
64
         * 16 - 1 = 15 porque 15 en binario es 1111.
65
         * 
66
         * Si queremos acceder a la linea del raster n?mero 83 (1010011) realizando la operaci?n And con el valor del
67
         * desplazamiento obtenemos (0001111 & 1010011 = 0000011), es decir el valor 3 en decimal. Esto quiere decir
68
         * que la l?nea 83 del raster es la 3 de su p?gina. 
69
         */
70
        private int offset = 1;
71
        /**
72
         * N?mero de p?ginas en cach?
73
         */
74
        private int nPags = 0;
75
        /**
76
         * N?mero de estructuras PageBandBuffer que tendr? el objeto PageBuffer. Cada una de estas
77
         * corresponde a una banda del buffer cacheada.
78
         */
79
        private int nPageBandBuffers = 0;
80
        /**
81
         * N?mero de grupos
82
         */
83
        private int nGroups = 0;
84
        /**
85
         * N?mero de bits para el desplazamiento de una p?gina. Por ejemplo, una p?gina de 64 l?neas
86
         * tendr? un bitsPag = 6
87
         */
88
        private int bitsPag = 0;
89
        /**
90
         * N?mero total de p?ginas en las que se divide el raster
91
         */
92
        private int nTotalPags = 0;
93
        /**
94
         * Tama?o de cache por banda del raster (cacheSize / NBandas)
95
         */
96
        private long cacheSizePerBand = 0;
97
        /**
98
         * Tama?o de p?gina por banda del raster (pagSize / NBandas)
99
         */
100
        private long pageSizePerBand = 0;
101
        /**
102
         * Tipo de dato de la cach?
103
         */
104
        private int        dataType = 0;
105
        
106
        /**
107
         * Calcula los par?metros del tama?o de cach? y de p?gina, asi como la altura de las mismas y el n?mero
108
         * de grupos que salen en cach?.
109
         * @param nBands N?mero de bandas del raster
110
         * @param dataType Tipo de dato de la imagen
111
         * @param dataSourceWidth ancho de cada l?nea completa del raster.
112
         */
113
        public CacheStruct(int nBands, int dataType, int dataSourceWidth, int dataSourceHeight){
114
                init(nBands, dataType, dataSourceWidth, dataSourceHeight);
115
        }
116
        
117
        /**
118
         * Constructor de una sola banda y sin el calculo de par?metros. Estos deben ser asignados
119
         * posteriorimente. Esta llamada es usada en casos especiales de creaci?n de buffers cacheados.
120
         */
121
        public CacheStruct() {
122
        }
123
        
124
        /**
125
         * Constructor solo para test. No utilizar con un uso normal de la librer?a
126
         * Calcula los par?metros del tama?o de cach? y de p?gina, asi como la altura de las mismas y el n?mero
127
         * de grupos que salen en cach?.
128
         * @param nBands N?mero de bandas del raster
129
         * @param dataType Tipo de dato de la imagen
130
         * @param dataSourceWidth ancho de cada l?nea completa del raster.
131
         */
132
        public CacheStruct(int nBands, int dataType, int dataSourceWidth, int dataSourceHeight, long cacheSize, long pageSize){
133
                this.cacheSize = cacheSize;
134
                this.pageSize = pageSize;
135
                init(nBands, dataType, dataSourceWidth, dataSourceHeight);
136
        }
137
        
138
        private void init(int nBands, int dataType, int dataSourceWidth, int dataSourceHeight){
139
                this.nPageBandBuffers = nBands;
140
                this.dataType = dataType;
141
                
142
                //Pasamos los megas a bytes
143
                cacheSize = cacheSize * 1048576;
144
                pageSize = pageSize * 1048576;
145
                
146
                cacheSizePerBand = (long)(cacheSize / nBands);
147
                pageSizePerBand = (long)(pageSize / nBands);
148
                                
149
                int dataSize = 0;
150
                int dataSizePerBand = 0;
151
                if (dataType == IBuffer.TYPE_BYTE){
152
                        dataSizePerBand = 1;
153
                } else if ((dataType == IBuffer.TYPE_SHORT) | (dataType == IBuffer.TYPE_USHORT)) {
154
                        dataSizePerBand = 2;
155
        } else if (dataType == IBuffer.TYPE_INT) {
156
                dataSizePerBand = 4;
157
        } else if (dataType == IBuffer.TYPE_FLOAT) {
158
                dataSizePerBand = 4;
159
        } else if (dataType == IBuffer.TYPE_DOUBLE) {
160
                dataSizePerBand = 8;
161
        }
162
                dataSize = dataSizePerBand * nBands;
163
                                
164
                //La altura de la p?gina depende del ancho de esta y del tipo de dato
165
                for(int i = (possibleHeights.length - 1); i >= 0; i --){
166
                        long size = (long)dataSourceWidth * (long)possibleHeights[i] * (long)dataSizePerBand; 
167
                        if(size <= pageSizePerBand){
168
                                hPag = possibleHeights[i];
169
                                break;
170
                        }
171
                }
172
                //Calculamos el tama?o de p?gina en bytes 
173
                pageSizePerBand = dataSourceWidth * hPag * dataSizePerBand;
174
                
175
                //Calculamos el n?mero de p?ginas que tendr? el buffer completo
176
                nPags = (int)(cacheSizePerBand / pageSizePerBand);
177
                                
178
                while((nPags % pagsPerGroup) != 0)
179
                        nPags ++;        
180
                
181
                //Recalculamos el tama?o de la cach?
182
                cacheSizePerBand = (long)(pageSizePerBand * nPags);
183
                
184
                //Calculamos el n?mero de grupos de cach?
185
                nGroups = (int)(nPags / pagsPerGroup);
186
                
187
                int h = hPag; 
188
                while(h > 1){
189
                        h >>= 1;
190
                        bitsPag ++;
191
                }
192
                
193
                //Calculamos el n?mero total de p?ginas en cach?
194
                nTotalPags = (int)(dataSourceHeight / hPag);
195
                if((dataSourceHeight % hPag) != 0)
196
                        nTotalPags ++;
197
                
198
                offset = hPag - 1;
199
                
200
                cacheSize = cacheSizePerBand * nBands;
201
                pageSize = pageSizePerBand * nBands;
202
        }
203

    
204
        /**
205
         * Obtiene el tama?o de cach? en Bytes
206
         * @return Tama?o de cach? en Bytes
207
         */
208
        public long getCacheSize() {
209
                return cacheSize;
210
        }
211

    
212
        /**
213
         * Obtiene la altura de la p?gina de cache en l?neas. 
214
         * @return N?mero de l?neas de altura de p?gina.
215
         */
216
        public int getHPag() {
217
                return hPag;
218
        }
219
        
220
        /**
221
         * Asigna la altura de la p?gina de cache en l?neas. 
222
         * @param N?mero de l?neas de altura de p?gina.
223
         */
224
        public void setHPag(int hPag){
225
                this.hPag = hPag;
226
        }
227

    
228
        /**
229
         * Obtiene el n?mero de bandas
230
         * @return N?mero de bandas
231
         */
232
        public int getNBands() {
233
                return nPageBandBuffers;
234
        }
235
        
236
        /**
237
         * Asigna el n?mero de bandas
238
         * @param N?mero de bandas
239
         */
240
        public void setNBands(int nBands){
241
                this.nPageBandBuffers = nBands;
242
        }
243

    
244
        /**
245
         * Obtiene el n?mero de p?ginas de la cach?
246
         * @return N?mero total de p?ginas de la cach?
247
         */
248
        public int getNPags() {
249
                return nPags;
250
        }
251
        
252
        /**
253
         * Asigna el n?mero de p?ginas de la cach?
254
         * @param N?mero total de p?ginas de la cach?
255
         */
256
        public void setNPags(int nPags) {
257
                this.nPags = nPags;
258
        }
259

    
260
        /**
261
         * Obtiene el tama?o de p?gina en bytes
262
         * @return Tama?o de p?gina en bytes
263
         */
264
        public long getPagSize() {
265
                return (long)pageSize;
266
        }
267
                
268
        /**
269
         * Obtiene el n?mero de p?ginas que contiene cada grupo.
270
         * @return N?mero de p?ginas de un grupo.
271
         */
272
        public int getPagsPerGroup() {
273
                return pagsPerGroup;
274
        }
275

    
276
        /**
277
         * Obtiene el n?mero de grupos de cach?
278
         * @return N?mero de grupos
279
         */
280
        public int getNGroups() {
281
                return nGroups;
282
        }
283
        
284
        /**
285
         * Asigna el n?mero de grupos de cach?
286
         * @param nGroups N?mero de grupos
287
         */
288
        public void setNGroups(int nGroups){
289
                this.nGroups = nGroups;
290
        }
291
        
292
        /**
293
         * Obtiene el n?mero total de p?ginas del raster
294
         * @return N?mero total de p?ginas
295
         */
296
        public int getNTotalPags() {
297
                return nTotalPags;
298
        }
299
        
300
        /**
301
         * Asigna el n?mero total de p?ginas del raster
302
         * @param N?mero total de p?ginas
303
         */
304
        public void setNTotalPags(int nPags){
305
                this.nTotalPags = nPags;
306
        }
307
        
308
        /**
309
         * Obtiene el n?mero de bits por p?gina para poder calcular el desplazamiento binario
310
         * de la direcci?n de acceso de la petici?n. Es decir si se solicita un dato en la l?nea
311
         * 36 (en decimal) del raster 100100(en binario) y el desplazamiento es 4 bits el n?mero de 
312
         * p?gina resultante ser? 10(en binario) 2 (en decimal)
313
         * @return N?mero de bits por p?gina.
314
         */
315
        public int getBitsPag() {
316
                return bitsPag;
317
        }
318
        
319
        /**
320
         * Asigna el n?mero de bits por p?gina para poder calcular el desplazamiento binario
321
         * de la direcci?n de acceso de la petici?n. Es decir si se solicita un dato en la l?nea
322
         * 36 (en decimal) del raster 100100(en binario) y el desplazamiento es 4 bits el n?mero de 
323
         * p?gina resultante ser? 10(en binario) 2 (en decimal)
324
         * @param bitsPag
325
         */
326
        public void setBitsPag(int bitsPag){
327
                this.bitsPag = bitsPag;
328
        }
329

    
330
        /**
331
         * Obtiene el valor del desplazamiento
332
         * Para extraer el desplazamiento de una direcci?n (l?nea de raster) hay que hacer una operaci?n And con 
333
         * con la altura de la p?gina -1. Por ejemplo, una p?gina de 16 l?neas de altura el desplazamiento ser?
334
         * 16 - 1 = 15 porque 15 en binario es 1111.
335
         * 
336
         * Si queremos acceder a la linea del raster n?mero 83 (1010011) realizando la operaci?n And con el valor del
337
         * desplazamiento obtenemos (0001111 & 1010011 = 0000011), es decir el valor 3 en decimal. Esto quiere decir
338
         * que la l?nea 83 del raster es la 3 de su p?gina. 
339
         * @return valor del desplazamiento
340
         */
341
        public int getOffset() {
342
                return offset;
343
        }
344

    
345
        /**
346
         * Asigna el valor del desplazamiento.
347
         * Para extraer el desplazamiento de una direcci?n (l?nea de raster) hay que hacer una operaci?n And con 
348
         * con la altura de la p?gina -1. Por ejemplo, una p?gina de 16 l?neas de altura el desplazamiento ser?
349
         * 16 - 1 = 15 porque 15 en binario es 1111.
350
         * 
351
         * Si queremos acceder a la linea del raster n?mero 83 (1010011) realizando la operaci?n And con el valor del
352
         * desplazamiento obtenemos (0001111 & 1010011 = 0000011), es decir el valor 3 en decimal. Esto quiere decir
353
         * que la l?nea 83 del raster es la 3 de su p?gina. 
354
         * @param offset valor del desplazamiento
355
         */
356
        public void setOffset(int offset){
357
                this.offset = offset;
358
        }
359

    
360
        /**
361
         * Obtiene el tama?o de la cach? por cada banda del raster. Hay que tener en
362
         * cuenta que cada banda se trata como una estructura de datos en memoria distinta
363
         * para poder hacer switch con las bandas de una forma sencilla
364
         * @return long con el tama?o de cache por banda
365
         */
366
        public long getCacheSizePerBand() {
367
                return cacheSizePerBand;
368
        }
369

    
370
        /**
371
         * Asigna el tama?o de la cach? por cada banda del raster. Hay que tener en
372
         * cuenta que cada banda se trata como una estructura de datos en memoria distinta
373
         * para poder hacer switch con las bandas de una forma sencilla
374
         * @param long con el tama?o de cache por banda
375
         */
376
        public void setCacheSizePerBand(long cacheSizePerBand) {
377
                this.cacheSizePerBand = cacheSizePerBand;
378
        }
379

    
380
        /**
381
         * Obtiene el tama?o de una p?gina de cach? correspondiente a una banda
382
         * @return tama?o de una p?gina de cach? correspondiente a una banda
383
         */
384
        public long getPagSizePerBand() {
385
                return pageSizePerBand;
386
        }
387

    
388
        /**
389
         * Asigna el tama?o de una p?gina de cach? correspondiente a una banda
390
         * @param tama?o de una p?gina de cach? correspondiente a una banda
391
         */
392
        public void setPagSizePerBand(long pagSizePerBand) {
393
                this.pageSizePerBand = pagSizePerBand;
394
        }
395
        
396
        /**
397
         * Imprime la informaci?n de estructura de cach?
398
         */
399
        public void show(){
400
                System.out.println("Cache (total size):" + cacheSize);
401
                System.out.println("Page (total size):" + pageSize);
402
                System.out.println("Cache (size per band):" + cacheSizePerBand);
403
                System.out.println("Page (size per band):" + pageSizePerBand);
404
                
405
                System.out.println("Number of Pags del raster:" + nTotalPags);
406
                System.out.println("Number of Pags de cache:" + nPags);
407
                System.out.println("Number of Bands:" + nPageBandBuffers);
408
                System.out.println("Number of Groups:" + nGroups);
409
                System.out.println("Pages per group:" + pagsPerGroup);
410
                System.out.println("bits per pag:" + bitsPag);
411
                System.out.println("Page Height (in lines):" + hPag);
412
        }
413

    
414
        /**
415
         * Obtiene el tipo de dato
416
         * @return Tipo de dato
417
         */
418
        public int getDataType() {
419
                return dataType;
420
        }
421

    
422
        /**
423
         * Asigna el tipo de dato
424
         * @param dataType
425
         */
426
        public void setDataType(int dataType) {
427
                this.dataType = dataType;
428
        }
429

    
430
}