-1

我目前正在处理一个大数据集(大约十亿个数据点),我决定使用 C++ 而不是 R,特别是为了方便内存分配。但是,为了“存储”数据集并避免每次运行程序时都必须读取数据,似乎不存在与 R Studio for C++ 的等价物,这非常耗时……什么样的C++ 用户使用大数据技术来“一次性”读取数据?

谢谢你的帮助!

4

3 回答 3

0

如何避免多次读取大数据集。C++ 用户使用什么样的技术来读取大数据以“一次性”读取数据?

我不知道任何具有这种功能的 C++ 工具,但我怀疑我是否曾经搜索过一个……似乎你可能会做的事情。关键字似乎是“数据框架”和“统计分析”(和 C++)。


如果您知道“数据集”格式,并且希望处理原始数据不超过一次,则可以考虑使用 Posix 共享内存。

我可以想象(a)“非常耗时”的工作可以(读取和)转换“原始”数据,并写入适合未来工作的“数据集”(文件)(即“一劳永逸” )。

然后(b)未来的努力可以“简单地”将创建的“数据集”(一个文件)“映射”到程序的内存空间中,所有这些都可以使用而无需(或至少大大减少)耗时的工作。

扩展程序的内存映射是关于使用“Posix”访问共享内存。(Ubuntu 17.10 有它,我在 C++ 中“轻轻地”使用它)术语包括 shm_open、mmap、munmap、shm_unlink 和其他一些。

来自'man mmap':

mmap() 在调用进程的虚拟地址空间中创建一个新映射。新映射的起始地址在...中指定

于 2018-06-02T16:13:26.353 回答
0

如何避免多次读取大数据集。C++ 用户使用什么样的技术来读取大数据以“一次性”读取数据?

我最近尝试测量 std::thread 上下文切换持续时间(在我的 Ubuntu 17.10 64 位桌面上)。我的应用在 10 秒的测量时间内捕获了不到 3000 万个条目。我还尝试了更长的测量时间和更大的捕获量。

作为调试信息捕获的一部分,我决定将中间结果写入文本文件,以查看将输入到分析中的内容。

该代码仅花费了大约 2.3 秒将此信息保存到捕获文本文件中。然后我的原始软件将继续进行分析。

但是这种延迟测试分析结果(> 12 sec = 10 + 2.3)很快就变得乏味了。

我发现分析工作具有挑战性,并认识到我可以通过捕获中间数据来节省时间,从而避免大部分(但不是全部)数据测量和捕获工作。因此,对中间文件的调试捕获成为对整体工作的方便拆分。

拆分应用程序的第 2 部分在不到 0.5 秒的时间内读取 <3000 万字节的中间文件,大大缩短了分析开发周期(编辑-编译-链接-运行-评估),这(通常)不再负担12+ 秒测量和数据生成。

虽然 28 M 字节不是大数据,但我很重视为我的分析代码开发工作节省的时间。


仅供参考 - 我的中间文件包含每个“进入临界区事件的线程”的单个字母。有 10 个线程,字母是“A”、“B”、...“J”。(让我想起了 dna 编码)

对于每个线程,我的分析支持每个线程的拆分计数。vxWorks 会“平衡”在信号量处阻塞的线程,而 Linux 不会……这对我来说是新的。

每个线程通过单个关键部分运行的次数不同,但每个线程获得了大约 10% 的机会。

技术:简单的编码文本文件,带有准备分析的捕获信息。

注意:我期待将应用程序第 1 部分的输出通过管道传输到应用程序第 2 部分。我猜还是可以的。在制品。

于 2018-08-01T17:13:55.663 回答
0

如果我了解您要实现的目标,即一次将一些数据加载到内存中,并在多次运行代码时使用相同的数据(在内存中),并可能修改该代码,则没有这样的 IDE,因为 IDE 不是换货来存储任何数据。

您可以做的是首先将您的数据加载到某个内存数据库中,然后编写您的 c++ 程序以从该数据库中读取数据,而不是直接从 C++ 中的数据源中读取数据。

于 2018-06-02T14:05:39.287 回答