コード例 #1
0
ファイル: NexusTester.cpp プロジェクト: trnielsen/mantid
  /** Execute the algorithm.
   */
  void NexusTester::exec()
  {
    std::string SaveFilename = getPropertyValue("SaveFilename");
    std::string LoadFilename = getPropertyValue("LoadFilename");
    std::string FakeDataType = getPropertyValue("FakeData");
    int ChunkSizeKb = getProperty("ChunkSize");
    int NumChunks = getProperty("NumChunks");
    bool Compress = getProperty("Compress");

    if (ChunkSizeKb <= 0) throw std::invalid_argument("ChunkSize must be > 0");
    if (NumChunks <= 0) throw std::invalid_argument("NumChunks must be > 0");

    // Size of the chunk in number of integers
    size_t chunkSize = ChunkSizeKb*1024 / sizeof(uint32_t);
    // ----------- Generate the fake data -----------------------------
    uint32_t * fakeData = new uint32_t[chunkSize];
    if (FakeDataType == "Zeros")
    {
      for (size_t i=0; i<chunkSize; i++)
        fakeData[i] = 0;
    } else if (FakeDataType == "Incrementing Numbers")
    {
      for (size_t i=0; i<chunkSize; i++)
        fakeData[i] = uint32_t(i);
    } else if (FakeDataType == "Random Numbers")
    {
      for (size_t i=0; i<chunkSize; i++)
        fakeData[i] = rand();
    }

    std::vector<int64_t> dims;
    dims.push_back(int64_t(chunkSize)*NumChunks);
    std::vector<int64_t> chunkDims;
    chunkDims.push_back(int64_t(chunkSize));

    // Total size in BYTES
    double dataSizeMB = double(chunkSize*NumChunks*sizeof(uint32_t)) / (1024.*1024.);
    g_log.notice() << "Data size is " << dataSizeMB << " MB" << std::endl;

    // ------------------------ Save a File ----------------------------
    if (!SaveFilename.empty())
    {
      ::NeXus::File file(SaveFilename, NXACC_CREATE5);
      file.makeGroup("FakeDataGroup", "NXdata", true);
      file.makeCompData("FakeData", ::NeXus::UINT32, dims, Compress ? ::NeXus::LZW : ::NeXus::NONE, chunkDims, true);
      Progress prog(this, 0.0, 1.0, NumChunks);
      CPUTimer tim;
      for (int i=0; i<NumChunks; i++)
      {
        std::vector<int64_t> startDims;
        startDims.push_back(i * int64_t(chunkSize));
        file.putSlab(fakeData, startDims, chunkDims);
        prog.report();
      }
      file.close();
      double seconds = tim.elapsedWallClock(false);
      double MBperSec = dataSizeMB / seconds;
      g_log.notice() << tim << " to save the file = " << MBperSec << " MB/sec" << std::endl;
      this->setProperty("SaveSpeed", MBperSec);
    }

    // Check the size of the file created/loaded
    Poco::File info(SaveFilename.empty() ? LoadFilename : SaveFilename);
    double fileSizeMB = double(info.getSize())/(1024.*1024.);
    g_log.notice() << "File size is " << fileSizeMB << " MB" << std::endl;

    double CompressionFactor = fileSizeMB / dataSizeMB;
    this->setProperty("CompressionFactor", CompressionFactor);

    bool ClearDiskCache = this->getProperty("ClearDiskCache");
    if (ClearDiskCache)
    {
      g_log.information() << "Clearing disk cache." << std::endl;
      if (system("sync ; echo 3 > /proc/sys/vm/drop_caches") != 0)
        g_log.error("Error clearing disk cache");
      Poco::Thread::sleep(100);
    }

    // ------------------------ Load a File ----------------------------
    if (!LoadFilename.empty())
    {
      ::NeXus::File file(LoadFilename, NXACC_READ);
      int HDFCacheSize = getProperty("HDFCacheSize");
      NXsetcache(HDFCacheSize);
      file.openGroup("FakeDataGroup", "NXdata");
      Progress prog(this, 0.0, 1.0, NumChunks);
      CPUTimer tim;

      for (int i=0; i<NumChunks; i++)
      {
        file.openData("FakeData");
        std::vector<int64_t> startDims;
        startDims.push_back(i * int64_t(chunkSize));
        file.getSlab(fakeData, startDims, chunkDims);
        prog.report();
        file.closeData();
      }

      file.close();

      double seconds = tim.elapsedWallClock(false);
      double MBperSec = dataSizeMB / seconds;
      this->setProperty("LoadSpeed", MBperSec);
      g_log.notice() << tim << " to load the file = " << MBperSec << " MB/sec (data), " << MBperSec*CompressionFactor << " MB/sec (file)" << std::endl;
    }

  }