Mercurial > hg > svcore
comparison data/fft/FFTFileCacheReader.cpp @ 555:8accc7969c1c
* Some steps to avoid backward seeks in MatrixFile in common use cases
| author | Chris Cannam |
|---|---|
| date | Mon, 09 Feb 2009 11:38:08 +0000 |
| parents | 60482f13e627 |
| children | 06f13a3b9e9e |
comparison
equal
deleted
inserted
replaced
| 554:60482f13e627 | 555:8accc7969c1c |
|---|---|
| 32 | 32 |
| 33 FFTFileCacheReader::FFTFileCacheReader(FFTFileCacheWriter *writer) : | 33 FFTFileCacheReader::FFTFileCacheReader(FFTFileCacheWriter *writer) : |
| 34 m_readbuf(0), | 34 m_readbuf(0), |
| 35 m_readbufCol(0), | 35 m_readbufCol(0), |
| 36 m_readbufWidth(0), | 36 m_readbufWidth(0), |
| 37 m_readbufGood(false), | |
| 37 m_storageType(writer->getStorageType()), | 38 m_storageType(writer->getStorageType()), |
| 38 m_factorSize(m_storageType == FFTCache::Compact ? 2 : 1), | 39 m_factorSize(m_storageType == FFTCache::Compact ? 2 : 1), |
| 39 m_mfc(new MatrixFile | 40 m_mfc(new MatrixFile |
| 40 (writer->getFileBase(), | 41 (writer->getFileBase(), |
| 41 MatrixFile::ReadOnly, | 42 MatrixFile::ReadOnly, |
| 154 } | 155 } |
| 155 | 156 |
| 156 void | 157 void |
| 157 FFTFileCacheReader::getValuesAt(size_t x, size_t y, float &real, float &imag) const | 158 FFTFileCacheReader::getValuesAt(size_t x, size_t y, float &real, float &imag) const |
| 158 { | 159 { |
| 160 // std::cerr << "FFTFileCacheReader::getValuesAt(" << x << "," << y << ")" << std::endl; | |
| 161 | |
| 159 switch (m_storageType) { | 162 switch (m_storageType) { |
| 160 | 163 |
| 161 case FFTCache::Rectangular: | 164 case FFTCache::Rectangular: |
| 162 real = getFromReadBufStandard(x, y * 2); | 165 real = getFromReadBufStandard(x, y * 2); |
| 163 imag = getFromReadBufStandard(x, y * 2 + 1); | 166 imag = getFromReadBufStandard(x, y * 2 + 1); |
| 209 } | 212 } |
| 210 | 213 |
| 211 bool | 214 bool |
| 212 FFTFileCacheReader::haveSetColumnAt(size_t x) const | 215 FFTFileCacheReader::haveSetColumnAt(size_t x) const |
| 213 { | 216 { |
| 217 if (m_readbuf && m_readbufGood && | |
| 218 (m_readbufCol == x || (m_readbufWidth > 1 && m_readbufCol+1 == x))) { | |
| 219 // std::cerr << "FFTFileCacheReader::haveSetColumnAt: short-circuiting; we know about this one" << std::endl; | |
| 220 return true; | |
| 221 } | |
| 214 return m_mfc->haveSetColumnAt(x); | 222 return m_mfc->haveSetColumnAt(x); |
| 215 } | 223 } |
| 216 | 224 |
| 217 size_t | 225 size_t |
| 218 FFTFileCacheReader::getCacheSize(size_t width, size_t height, | 226 FFTFileCacheReader::getCacheSize(size_t width, size_t height, |
| 226 void | 234 void |
| 227 FFTFileCacheReader::populateReadBuf(size_t x) const | 235 FFTFileCacheReader::populateReadBuf(size_t x) const |
| 228 { | 236 { |
| 229 Profiler profiler("FFTFileCacheReader::populateReadBuf", false); | 237 Profiler profiler("FFTFileCacheReader::populateReadBuf", false); |
| 230 | 238 |
| 231 std::cerr << "FFTFileCacheReader::populateReadBuf(" << x << ")" << std::endl; | 239 // std::cerr << "FFTFileCacheReader::populateReadBuf(" << x << ")" << std::endl; |
| 232 | 240 |
| 233 if (!m_readbuf) { | 241 if (!m_readbuf) { |
| 234 m_readbuf = new char[m_mfc->getHeight() * 2 * m_mfc->getCellSize()]; | 242 m_readbuf = new char[m_mfc->getHeight() * 2 * m_mfc->getCellSize()]; |
| 235 } | 243 } |
| 236 | 244 |
| 245 m_readbufGood = false; | |
| 246 | |
| 237 try { | 247 try { |
| 238 m_mfc->getColumnAt(x, m_readbuf); | 248 bool good = false; |
| 249 if (m_mfc->haveSetColumnAt(x)) { | |
| 250 // If the column is not available, we have no obligation | |
| 251 // to do anything with the readbuf -- we can cheerfully | |
| 252 // return garbage. It's the responsibility of the caller | |
| 253 // to check haveSetColumnAt before trusting any retrieved | |
| 254 // data. However, we do record whether the data in the | |
| 255 // readbuf is good or not, because we can use that to | |
| 256 // return an immediate result for haveSetColumnAt if the | |
| 257 // column is right. | |
| 258 good = true; | |
| 259 m_mfc->getColumnAt(x, m_readbuf); | |
| 260 } | |
| 239 if (m_mfc->haveSetColumnAt(x + 1)) { | 261 if (m_mfc->haveSetColumnAt(x + 1)) { |
| 240 m_mfc->getColumnAt | 262 m_mfc->getColumnAt |
| 241 (x + 1, m_readbuf + m_mfc->getCellSize() * m_mfc->getHeight()); | 263 (x + 1, m_readbuf + m_mfc->getCellSize() * m_mfc->getHeight()); |
| 242 m_readbufWidth = 2; | 264 m_readbufWidth = 2; |
| 243 } else { | 265 } else { |
| 244 m_readbufWidth = 1; | 266 m_readbufWidth = 1; |
| 245 } | 267 } |
| 268 m_readbufGood = good; | |
| 246 } catch (FileReadFailed f) { | 269 } catch (FileReadFailed f) { |
| 247 std::cerr << "ERROR: FFTFileCacheReader::populateReadBuf: File read failed: " | 270 std::cerr << "ERROR: FFTFileCacheReader::populateReadBuf: File read failed: " |
| 248 << f.what() << std::endl; | 271 << f.what() << std::endl; |
| 249 memset(m_readbuf, 0, m_mfc->getHeight() * 2 * m_mfc->getCellSize()); | 272 memset(m_readbuf, 0, m_mfc->getHeight() * 2 * m_mfc->getCellSize()); |
| 250 } | 273 } |
