Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法以编程方式检查程序的RAM使用情况?_C++ - Fatal编程技术网

C++ 有没有办法以编程方式检查程序的RAM使用情况?

C++ 有没有办法以编程方式检查程序的RAM使用情况?,c++,C++,我编写了一个程序,读取市场行情数据,并将数据拆分成10000个左右的小文件,每个符号一个文件。然而,它的方式太慢,因为我有5年的数据处理,在这个速度将需要太长时间。我一次打开500条流,一次写一条消息(1到5行)的数据。我认为这是瓶颈。我一次只能打开512个流,所以我必须对数据运行20次左右 因此,我的想法是将拆分的消息存储在字符串中,并在达到rammax后将其转储到文件中,我需要一种通过编程方式进行检查的方法。文件大小在10gb到100gb之间,具体取决于当天市场的活跃程度,我的系统有8gb的

我编写了一个程序,读取市场行情数据,并将数据拆分成10000个左右的小文件,每个符号一个文件。然而,它的方式太慢,因为我有5年的数据处理,在这个速度将需要太长时间。我一次打开500条流,一次写一条消息(1到5行)的数据。我认为这是瓶颈。我一次只能打开512个流,所以我必须对数据运行20次左右

因此,我的想法是将拆分的消息存储在字符串中,并在达到rammax后将其转储到文件中,我需要一种通过编程方式进行检查的方法。文件大小在10gb到100gb之间,具体取决于当天市场的活跃程度,我的系统有8gb的RAM

我的计划可行吗?有更好的方法吗

用例:此数据只会从头到尾顺序读取,以重放市场模拟并测试特定符号/天的不同交易策略

一个HDD在写入一个大文件而不是100个小文件时要有效得多,因为它可以在一次针扫中一个接一个地转储数据。我假设您使用的是HDD,因为您谈论的数据量在谈论SSD时有点昂贵,这可能会延长您面临的问题

它变得越来越慢的原因是,您的操作系统在迭代许多文件时遇到困难。数据库更有效,因为它是一个大文件(实际上是一对,但不到10个)。最终的结果是,您的“10gb”或“100gb”文件要小得多,因为它不必写入头文件,也不必单独处理文件,因为这将是一个巨大的数据块

如果可以更改应用程序,则将数据存储在数据库中。如果不是这样,您可以创建一个简单的脚本来遍历每个文件,将数据存储在适当的列中,然后删除该文件

请记住,当文件当前正在写入时,它将有一个适当的位置。在将数据转储到数据库之前,请检查此项


将数据存储在数据库中具有优势,所有数据都可以轻松访问。

按标题要求检查ram使用情况;不久前,我可以看到:


不幸的是,这是我唯一能提供帮助的方法。

关于您的问题,如果您使用Windows,则进程没有“内存使用”常规计数器,而是“进程虚拟地址空间中当前驻留在物理内存中的页面集”

这就是所谓的工作集

可以相应地调整流程的最小和最大工作集。此外,还可以获得当前工作集的大小

请参阅以下Windows API:

GetProcessMemoryInfo:

要查询和调整工作集限制,请执行以下操作:

GetProcessWorkingSetEx

SetProcessWorkingSetEx


对于Linux系统,读取/proc/self/status将提供相同类型的信息(称为RSS:Resident Set Size)。处于返回状态的RSS是第24个字段。

您可以将一个文件分为两个过程,前提是片段数(稍微)小于最大打开文件数(顺便说一句,这通常是可配置的,因此您可能可以做得比500个更好)

您需要一个相当好的散列函数。现在假设您要使用最多N个同时打开的文件将其拆分为N个部分,并且假设N小于N²。在第一个过程中,打开n个临时文件,每个文件都是一个哈希桶。您可以使用哈希函数将每个符号分配给这n个存储桶中的一个

如果您的散列函数是好的,那么您将在每个bucket中得到非常接近N/N的符号。如果N稍小于N²,则每个bucket中的不同符号不应超过N个,您可以在第二遍中单独处理每个bucket,将其拆分为单独的符号文件

在你的例子中,N大约是10000,比500²小很多


由于bucket文件的总大小与原始文件的大小相同,因此最终将读取所有数据两次,这应该比读取20次快一些。

瓶颈可能是硬盘,显然是您的存储方法。为什么不将数据存储在数据库中?在不改变原始程序的情况下,您基本上可以创建一个脚本来读取文件、将数据存储在数据库中并将其删除。使用数据库来归档并非每个tick使用的数据,并将tmpfs用作tick数据的源。它比硬盘快得多。在这种情况下,您的tmpfs体积消耗将显示您需要什么。