From b90f0d4e15a410d604e9cb40b609927b8a808bb8 Mon Sep 17 00:00:00 2001 From: David Williams Date: Fri, 10 Apr 2015 16:47:50 +0200 Subject: [PATCH 1/2] Made the FilePager a little more robust regarding filename conflicts. --- include/PolyVox/FilePager.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/include/PolyVox/FilePager.h b/include/PolyVox/FilePager.h index 04eb3b04..60a4cba7 100644 --- a/include/PolyVox/FilePager.h +++ b/include/PolyVox/FilePager.h @@ -56,13 +56,12 @@ namespace PolyVox m_strFolderName.append("/"); } - // Build a unique prefix to avoid multiple pagers using the same filenames. - srand(static_cast(time(0))); - int iRandomValue = rand(); - + // Build a unique postfix to avoid filename conflicts between multiple pagers/runs. + // Not a very robust solution but this class is meant as an example for testing really. std::stringstream ss; - ss << std::hex << iRandomValue; - m_strRandomPrefix = ss.str(); + ss << time(0) << "--"; // Avoid multiple runs using the same filenames. + ss << this; // Avoid multiple FilePagers using the same filenames. + m_strPostfix = ss.str(); } /// Destructor @@ -82,9 +81,10 @@ namespace PolyVox POLYVOX_ASSERT(pChunk->getData(), "Chunk must have valid data"); std::stringstream ssFilename; - ssFilename << m_strFolderName << "/" << m_strRandomPrefix << "-" + ssFilename << m_strFolderName << "/" << region.getLowerX() << "_" << region.getLowerY() << "_" << region.getLowerZ() << "_" - << region.getUpperX() << "_" << region.getUpperY() << "_" << region.getUpperZ(); + << region.getUpperX() << "_" << region.getUpperY() << "_" << region.getUpperZ() + << "--" << m_strPostfix; std::string filename = ssFilename.str(); @@ -133,9 +133,10 @@ namespace PolyVox POLYVOX_LOG_TRACE("Paging out data for " << region); std::stringstream ssFilename; - ssFilename << m_strFolderName << "/" << m_strRandomPrefix << "-" + ssFilename << m_strFolderName << "/" << region.getLowerX() << "_" << region.getLowerY() << "_" << region.getLowerZ() << "_" - << region.getUpperX() << "_" << region.getUpperY() << "_" << region.getUpperZ(); + << region.getUpperX() << "_" << region.getUpperY() << "_" << region.getUpperZ() + << "--" << m_strPostfix; std::string filename = ssFilename.str(); @@ -163,7 +164,7 @@ namespace PolyVox protected: std::string m_strFolderName; - std::string m_strRandomPrefix; + std::string m_strPostfix; std::vector m_vecCreatedFiles; }; From c562341db05dc0c007e625bb28f2db295f063083 Mon Sep 17 00:00:00 2001 From: David Williams Date: Fri, 10 Apr 2015 16:56:19 +0200 Subject: [PATCH 2/2] Added a second PagedVolume to the tests with much higher allowed memory usage. This makes more sense when testing random access, as low permitted memory usage causes disk IO to become the bottleneck. --- tests/testvolume.cpp | 12 +++++++----- tests/testvolume.h | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/testvolume.cpp b/tests/testvolume.cpp index d17d4e4b..a35cdaa6 100644 --- a/tests/testvolume.cpp +++ b/tests/testvolume.cpp @@ -225,7 +225,7 @@ int32_t testDirectRandomAccess(const VolumeType* volume) std::mt19937 rng; int32_t result = 0; - for (uint32_t ct = 0; ct < 10000; ct++) + for (uint32_t ct = 0; ct < 1000000; ct++) { uint32_t rand = rng(); @@ -258,10 +258,12 @@ TestVolume::TestVolume() m_regExternal.shiftUpperCorner(2, 5, 4); m_pFilePager = new FilePager("."); + m_pFilePagerHighMem = new FilePager("."); //Create the volumes m_pRawVolume = new RawVolume(m_regVolume); m_pPagedVolume = new PagedVolume(m_pFilePager, 1 * 1024 * 1024, m_uChunkSideLength); + m_pPagedVolumeHighMem = new PagedVolume(m_pFilePagerHighMem, 256 * 1024 * 1024, m_uChunkSideLength); //Fill the volume with some data for (int z = m_regVolume.getLowerZ(); z <= m_regVolume.getUpperZ(); z++) @@ -273,11 +275,11 @@ TestVolume::TestVolume() int32_t value = x + y + z; m_pRawVolume->setVoxel(x, y, z, value); m_pPagedVolume->setVoxel(x, y, z, value); + m_pPagedVolumeHighMem->setVoxel(x, y, z, value); } } } - // Note - We are reusing the FilePager for testing... watch out for conflicts with the main volume. m_pPagedVolumeChunk = new PagedVolume::Chunk(Vector3DInt32(10000, 10000, 10000), m_uChunkSideLength, nullptr); std::mt19937 rng; for (uint16_t z = 0; z < m_uChunkSideLength; z++) @@ -488,7 +490,7 @@ void TestVolume::testRawVolumeDirectRandomAccess() { result = testDirectRandomAccess(m_pRawVolume); } - QCOMPARE(result, static_cast(805464457)); + QCOMPARE(result, static_cast(267192737)); } void TestVolume::testPagedVolumeDirectRandomAccess() @@ -496,9 +498,9 @@ void TestVolume::testPagedVolumeDirectRandomAccess() int32_t result = 0; QBENCHMARK { - result = testDirectRandomAccess(m_pPagedVolume); + result = testDirectRandomAccess(m_pPagedVolumeHighMem); } - QCOMPARE(result, static_cast(805464457)); + QCOMPARE(result, static_cast(267192737)); } int32_t TestVolume::testPagedVolumeChunkAccess(uint16_t localityMask) diff --git a/tests/testvolume.h b/tests/testvolume.h index a7645977..624c155c 100644 --- a/tests/testvolume.h +++ b/tests/testvolume.h @@ -72,6 +72,7 @@ private: PolyVox::Region m_regInternal; PolyVox::Region m_regExternal; PolyVox::FilePager* m_pFilePager; + PolyVox::FilePager* m_pFilePagerHighMem; PolyVox::RawVolume* m_pRawVolume; PolyVox::PagedVolume* m_pPagedVolume;