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

时间:2017-03-07 21:16:47

标签: c++

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

所以我的想法是将拆分消息存储在字符串中,并在达到ram max后将它们转储到文件中,我需要一种方法来进行编程检查。这些文件介于10gb到100gb之间,具体取决于市场在特定日期的活跃程度,我的系统有8GB的RAM。

我的计划是否可行?有没有更好的方法呢?

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

4 个答案:

答案 0 :(得分:1)

在写入1个大文件而不是100个小文件时,硬盘 更有效,因为它可以在1次单针刷针中相互转发数据。我假设你正在使用硬盘驱动器,因为你所谈论的数据量在讨论固态硬盘时会很昂贵,这可能会延长你所遇到的问题。

它变慢的原因是因为您的操作系统难以迭代许多文件。数据库更有效,因为它是一个大文件(实际上是一对,但少于10)。最终结果是你的“10gb”或“100gb”文件是 lot 更小,因为它不必编写标题并单独处理文件,因为它将是1个巨大的数据blob。

如果您可以更改应用程序,请将数据存储在数据库中。如果不是,您可以创建一个迭代每个文件的简单脚本,将数据存储在正确的列中并删除文件。

请记住,当文件当前正在写入时,它将有一个file lock。在将数据转储到数据库之前检查它。

将数据存储在数据库中具有优势,所有数据都可以毫不费力地访问。

答案 1 :(得分:0)

将ram用法检查为标题要求;我不久前可以解决这个问题:

Get-Process with total memory usage

不幸的是,这是我可以提供帮助的唯一方式。

答案 2 :(得分:0)

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

这就是所谓的工作集

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

请参阅以下Windows API:

GetProcessMemoryInfo:https://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx

查询和调整工作集限制:

GetProcessWorkingSetEx https://msdn.microsoft.com/en-us/library/windows/desktop/ms683227(v=vs.85).aspx

SetProcessWorkingSetEx https://msdn.microsoft.com/en-us/library/windows/desktop/ms686237(v=vs.85).aspx

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

答案 3 :(得分:0)

如果文件的数量(稍微)小于打开文件的最大数量(通常可以配置,那么你可能比500更好),你可以分两个文件分割文件。 / p>

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

如果你的哈希函数是好的,你最终会在每个桶中非常接近 N / n 符号。如果 N 略小于 n ²,那么每个存储桶中的符号不​​应超过 n ,并且每个符号都可以处理在第二遍中单独存储以将其拆分为单独的符号文件。

在你的情况下, N 大约是10,000,这远远小于500²。

由于存储桶文件的总大小与原始文件的大小相同,因此最终会读取所有数据两次,这比阅读它的速度快20倍。