因此,boost以R树的形式提供了良好的空间索引功能.这很整洁,但是一旦它构建完成,它似乎还不能序列化它,我错了吗?
通常的"out_archive << rtree"语法不起作用,因为rtree没有serialize()成员.在boost 1.57中似乎有一些实验代码,例如/boost/geometry/index/detail/serialization.hpp,但它实际上似乎没有编译!
所以第一个问题:有人知道如何使用boost序列化R树吗?
如果没有,那么我的第二个问题是:您将如何将索引永久存储在磁盘上以避免每次都重建它?(我有一个145M条目的数据集,构建索引需要几个小时,所以我真的不想不止一次构建它!)
我很清楚允许C代码运行python代码的许多可能性,反之亦然(Cython,Boost.Python,...).但是,除非我弄错了,所有这些方法只是"调用"相关的python脚本并管理C程序和python脚本之间的交互.因此,需要安装python.
在我的情况下,我想要一个独立的解决方案,我的python代码可以以某种方式编译并链接到我的主要C++程序.我对Cython抱有希望,因为它允许我编译我的脚本并创建一个.so文件.但是,我似乎无法将.so文件"链接"到我的C++程序中.我尝试了以下方法:
一个简单的python脚本,包含一个函数multiply(a,b),它返回一个*b; 我使用cython创建了一个libmultiply.so文件.一个简短的Cpp文件,输出乘法(5,2)的结果:
int multiply(int, int);
int main()
{
std::cout << multiply(5,2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我通过以下方式构建:g ++ test.cpp -L/home/jerome/-lmultiply
这给了我错误:
test.cpp:(.text+0x2b): undefined reference to `multiply(int, int)'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我不确定我尝试的是否有意义,但希望它能让你了解我想要实现的目标.
我使用自定义 Docker 容器与ml.p2.xlarge实例上的 SageMaker 配合使用。
基础镜像是tiangolo/python-machine-learning:cuda9.1-python3.7,它通常附带所需的 CUDA 工具包。python 包通过 conda 使用以下极简安装environment.yaml:
dependencies:
- boto3
- joblib
- keras
- numpy
- pandas
- scikit-learn
- scipy
- tensorflow=2.0
Run Code Online (Sandbox Code Playgroud)
但是,当我为小型lenet5CNN 运行训练作业时,我在日志中看不到任何 GPU 活动(并且训练持续时间与非 GPU 实例一样长)。
更让人担心的是,len(tf.config.experimental.list_physical_devices('GPU')返回时0,K.tensorflow_backend._get_available_gpus()却是空的。最后,如果我检查tf.debugging.set_log_device_placement(True)基本操作的设备放置(使用 ),如下所示:
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)
print(c)
Run Code Online (Sandbox Code Playgroud)
我明白了
Executing op _MklMatMul in device /job:localhost/replica:0/task:0/device:CPU:0 …Run Code Online (Sandbox Code Playgroud)