2014-02-23 58 views
1

我创建了一个动态C++库,它依赖于大约30 MB或更多MB的数据。现在我试图找出什么是最好的方式来存储这些数据。创建包含大数据的共享库的最佳实践

数据本质上是一个拥有超过百万个元素的大数组。

我想要安装/卸载库应尽可能简单。该库可以通过其他接口程序(如终端程序,R程序等)进行引用。它只需要支持UNIX

我的一个想法是将数据硬编码为一个大数组并将该文件编译到库中,但这似乎并不是正确而且有效的做事方式。另外,如果我使文件大于1GB,那么thigs会失控。

另一个我是将数据文件复制到预定义的路径,并将库中的引用硬编码到该路径。但是,有些用户不希望将所有内容安装到默认安装路径。

我的另一个想法是让每个接口都有能力提供数据文件的路径,但是看起来接口很麻烦,为什么接口应该知道库数据的位置?

有没有人知道这种情况下的实践?

+0

您可以选择使用内存映射文件。如果只需要访问一部分数据,可能会更有益。 –

+0

我可以使用它,但首先我需要将信息存储在某处。这就是我目前的问题是关于 – user1047833

回答

2

我不认为有一个“正确”的答案。

将数据存储在文件中是没有问题的,只要数据的变化频率比您希望发布新库的时间更长 - 无论如何您都需要以某种方式存储数据量,只要编译器在将数据存储在共享库中时并不会做出糟糕的工作,就我所见,它并不比其他选项差。

只有当您希望数据更改频率超过您希望发布新共享库时,才有用辅助文件。它增加了打开和阅读辅助文件的额外复杂性 - 缺点是,您还需要添加检查它是否正确/存在,并且处理它的代码不在那里。

如果你有一个辅助文件,有一些重新定义位置的方法肯定会有好处。

如果数据真的很大,可能需要使用压缩格式。您仍然可以将压缩数据作为数据存储在共享库中,并使用可从中扩展数据的压缩库。或者你可以使用从外部文件中读取库...

最后,它真的可以归结为:

  1. 你将如何使用数据 - 你总是需要所有这一切,或者你有时需要一些吗?如果后者,你怎么知道哪些位?
  2. 数据更改的频率。
  3. 如果数据可以被压缩,如果是的话,你用什么方法压缩它?

我不确定在共享库上是否有任何直接的大小限制 - 如果你需要1GB的数据,那么你需要1GB的内存空间,所以它不像你保存内存[假设你总是需要所有的数据和/或无法确定你需要哪些部分]。

+0

好的谢谢。我将尝试使用库来编译数据 - 这很快给我带来了一个问题。堆栈对我来说太小,你不能用预定义的值定义向量或堆数组。看到我有成千上万的值,我只是想做一些像int [] pValues = {5,...,10}。任何想法,我怎么能做到这一点? – user1047833

+1

使用'const static int pValues [] = {...}'? –

1

您可以使用测试文件并将数据保存为压缩二进制格式。然后分发文本文件和dll/lib在一起