如何在Qt项目中打包大数据
How to package large data in a Qt Project?
我正在做一个Qt项目,其中包括一个大型数据集(70Mb+)。
数据将被通过数据路径访问它们的库使用。
我知道我可以正常使用资源,但由于它们是内存对象,我不能在库中使用它们。
所以我的问题是,我如何包装一个文件或文件夹,使它可以在安装/运行时供任何人访问?
这些资源在进程的内存中可用,因此进程中使用的任何库都可以访问它们。只需使用QResource
类查找资源的地址和大小,并将其传递给库。
如果库不能接受指针和数据的大小,但坚持一个文件,你可以使用QResource
, QTemporaryFile
和QFile::copy
转储数据从你的可执行文件到一个临时文件,使库有一些工作。
库应该有两种接受数据的方式:
-
进程内数据:地址+大小。例如
setData(void * address, int size);
-
进程外数据:文件路径+偏移量+大小。
setData(const char * filePath, void * offset = 0, int size = -1); // size = -1 uses the entire file
这将允许库:
-
使用进程内存中可用的二进制资源,无论是来自
QResource
或WINAPI资源,还是从网络下载后保存在临时缓冲区中,等等 -
使用文件中可用的二进制资源,包括Qt和Windows资源,这些资源在可执行文件本身的偏移处可用。
所以在花了更多的时间在Qt和c++开发之后,一般来说,你根本不需要Qt来实现这个功能。
你需要的是修改你的构建过程,以便在构建完成后随二进制文件一起发布你需要的文件。
好消息是,这是超级简单的cmake。
在构建cmake代码后,只需将运行时可用的任何文件复制到输出目录:
add_custom_command(TARGET ${PROJECT} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${RES_DIR} $<TARGET_FILE_DIR:${PROJECT}>/RES/)
其中PROJECT为目标的名称。
RES_DIR:资源目录的全路径
相关文章:
- std::bad_alloc 在大数据集的 Dijkstra 计算期间
- 使用 QT C++过滤大数据的最佳方式
- OpenSSL模块化最大数据类型大小的简单方法
- 对大数据使用提升filtering_streambuf
- std::fstream 需要很长时间才能将大数据写入.csv文件中
- QT:如何使用QT复制大数据
- 超过芯片组允许的最大数据类型.C++
- 写入单个大数据文件或多个小文件:哪个更快?
- 如何在以下C程序中计算运行时间内存和最大数据存储器使用情况
- 从TXT中取出大数据并对其进行排序
- 如何判断C++中的最大数据对齐要求
- 如何在Qt中从txt文件加载大数据
- Websocket Poco无法接收大数据
- 读取 4 GB 的大数据文件 C++
- 使用地图对大数据进行计数
- 创建包含大数据的共享库的最佳实践
- FFmpeg av_read_frame和最大数据包大小
- 多播大数据包包含多个客户端的所有信息,而单个数据包则包含目标客户端的信息
- c++通过套接字在一个数据包中发送大数据
- C++停止CAsyncSocket将单个大数据包拆分为多个小数据包