/gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp: In member function ‘boost::filesystem::path CDB::GetFileNameOut() const’:
/gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp:84:53: error: no matching function for call to ‘boost::filesystem::path::assign(const char* const&, char*)’
/gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp:84:53: note: candidates are:
In file included from /gpfs/soft/boost/include/boost-1_53/boost/filesystem.hpp:16:0,
from /gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/stdafx.h:32,
from /gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp:1:
/gpfs/soft/boost/include/boost-1_53/boost/filesystem/path.hpp:206:11: note: boost::filesystem::path& boost::filesystem::path::assign(const value_type*, const codecvt_type&)
/gpfs/soft/boost/include/boost-1_53/boost/filesystem/path.hpp:206:11: note: no known conversion for argument 2 from ‘char*’ to ‘const codecvt_type& {aka const std::codecvt<wchar_t, char, __mbstate_t>&}’
/gpfs/soft/boost/include/boost-1_53/boost/filesystem/path.hpp:213:11: note: template<class Source> boost::filesystem::path& boost::filesystem::path::assign(const Source&, const codecvt_type&)
/gpfs/soft/boost/include/boost-1_53/boost/filesystem/path.hpp:213:11: note: template argument deduction/substitution failed:
/gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp:84:53: note: cannot convert ‘strrchr(((const char*)((const CDB*)this)->CDB::m_pSource), 46)’ (type ‘char*’) to type ‘const codecvt_type& {aka const std::codecvt<wchar_t, char, __mbstate_t>&}’
In file included from /gpfs/soft/boost/include/boost-1_53/boost/filesystem.hpp:16:0,
from /gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/stdafx.h:32,
from /gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp:1:
/gpfs/soft/boost/include/boost-1_53/boost/filesystem/path.hpp:221:11: note: template<class InputIterator> boost::filesystem::path& boost::filesystem::path::assign(InputIterator, InputIterator)
/gpfs/soft/boost/include/boost-1_53/boost/filesystem/path.hpp:221:11: note: template argument deduction/substitution failed:
/gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp:84:53: note: deduced conflicting types for parameter ‘InputIterator’ (‘const char*’ and ‘char*’)
In file included from /gpfs/soft/boost/include/boost-1_53/boost/filesystem.hpp:16:0,
from /gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/stdafx.h:32,
from /gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp:1:
/gpfs/soft/boost/include/boost-1_53/boost/filesystem/path.hpp:227:11: note: template<class InputIterator> boost::filesystem::path& boost::filesystem::path::assign(InputIterator, InputIterator, const codecvt_type&)
/gpfs/soft/boost/include/boost-1_53/boost/filesystem/path.hpp:227:11: note: template argument deduction/substitution failed:
/gpfs/home/ak/osm/osmpbf2sqlite/OsmPbf2sqlite/DB.cpp:84:53: note: deduced conflicting types for parameter ‘InputIterator’ (‘const char*’ and ‘char*’)
make[2]: *** [OsmPbf2sqlite/CMakeFiles/OsmPbf2sqlite.dir/DB.cpp.o] Error 1
make[1]: *** [OsmPbf2sqlite/CMakeFiles/OsmPbf2sqlite.dir/all] Error 2
make: *** [all] Error 2
Но если больше ни у кого этой ошибки не будет, смысла мучаться и исправлять нет - система просто тестовая (кластер без обновления основной ОС с 2007 г.).
Видимо, все дело в разных _tcsrchr или std::codecvt . Там в системе 2 разных GCC, причём системный - древнейший 3.4. Я постарался перестроить на новый переменными окружения, но, видимо, не до конца получилось…
Но если кто знает, как “кросплатформеннее” написать boost::filesystem::path sOut; Out.assign(m_pSource,_tcsrchr( m_pSource,_T(‘.’))); - подскажите
Я достаточно писал под windows в своё время чтобы искренне жалеть тех кто продолжает этим заниматься Тем не менее отквоченное к windows вообще никак не относилось.
Дальше было и не про windows. Просто под windows пришлось-таки овладеть технологией и использовать на разных платформах.
Если у кого-то не получается, не факт, что технология виновата.
Добрался до кластера. Всё отлично компилируется, да и выглядит sOut.replace_extension(“.db3”) приятнее Спасибо!
Решил попробовать на многопоточность (12 ядер на узле всё же). Получилось вот что:
на файле RU-BA.osm.pbf (Башкирия):
1 ядро - 40.6 с
2 ядра - 46.7 с
4 ядра - 46.2 с
12 ядер - 49.4 с
При переходе с жесткого диска на временные файлы в оперативке (/dev/shm) стало на 5 сек. быстрее, но соотношение не изменилось.
То же на рабочей машине под Windows (VS2012,x64) (Core2duo 6700): 1 ядро - 57.5-61.9 с., 2 ядра - 58.9-61 с.
Число ядер менял, передавая его в конструктор:
Получается что boost::mutex работает чуть по другому чем виндовые критические секции. То есть дольше чем я предполагал. В результате расходы на переключения контекста съедают все преимущества мультипоточности.
Или я их неправильно использую. Буду ковырять дальше.
Необязательно. Ещё может быть блокировка на каком-то общем ресурсе. Для анализа желателен профайлер и дампы состояний потоков в ключевые моменты прогона.
Попробовал обновленную версию, всё стало лучше:
1поток - 39 c 2 - 32.2 c 3 - 31.8c 4 - 31.2c 12 - 30.7c
(2x6 core Xeon X5670, Redhat 6)
То же компилятором Intel (лучше оптимизирует):
1поток - 32 c, а больше - хуже
Выгоды от использования больше 2 потоков пока не видно (а на сервере - даже наоборот вред, т.к. тормозится всё остальное), так что предлагаю как-то ограничить программно. Все равно все упрется в диск и SQLITE. Прилагаю свой патч, c которым тестировал (можно выбирать число ядер третьим параметром + в CMake есть закомментированные настройки для нестандартных GCC/boost): https://dl.dropboxusercontent.com/u/63393258/threads.patch