速度:命名共享内存与内存映射文件与正常内存

时间:2016-03-12 14:18:25

标签: c++ windows sql-server-2008 memory

我们说我有一台服务器,连接的客户不断更新他们的库存。

我可以在项目更新后将更改保存到数据库中,或者我可以在客户端离开会话后更新整个库存。

如果我采用第一种方法,根据我目前的规格,我无法同时处理所有这些。如果我选择第二个,并且由于某种原因我的应用程序死亡,则更新永远不会存储在数据库中。

我该怎么做才能解决这个问题?

我只能提出两个解决方案(两者都意味着校验和):

  1. 运行辅助应用程序,它只创建一个命名的共享内存。主应用程序将使用此内存作为所有客户端的清单,如果我的应用程序死亡,则辅助应用程序将保持共享内存,因此数据可以在主应用程序重新启动后保存。

  2. 将每个客户端映射到一个文件,即user1.dat,user2.dat,就像共享内存一样。但是,这会让我的节目变慢吗?还是像指定的共享内存一样快? (如果我理解正确,它应该一样快)(这是我现在的顶级列表中的那个)。

  3. 更新在有用的评论之后,希望有一个更好的主意:创建另一个线程,为每个客户端创建一个文件,并在每个项目更改后立即更新它。一旦用户离开,只有整个库存将作为单个事务存储在数据库中。意味着所有更新都发生,或者没有。如果服务器崩溃或关闭,我只需要再次运行它。没有内存映射文件,当然我会在每次更新后刷新文件,并确保我已更新的部分已正确编写,即原子提交。我' m不完全确定这是否会加快速度,因为数据库和数据库都是如此。将更新存储在每个文件中将在一天结束时使用硬盘驱动器。
  4. 更具体地说明第二种方法:

    至少在Windows中是否有保证,以下3种方法在写入/读取时都会一样快? 如果有任何延迟,我需要知道。

    据我了解,甚至文件映射方法都会立即更新内存,但不会更新文件本身(这很好)。

    // normal memory accesss
    int *normal_address =            (int*)0x10203040;
    *normal_address = 6;             //write: 0.00002sec (for example)
    int get_value = *normal_address; //read: 0.000001sec (for example)
    
    // named shared memory
    int *normal_address =            (int*)0x10203040;
    *normal_address = 6;             //write: 0.00002sec (for example)
    int get_value = *normal_address; //read: 0.000001sec (for example)
    
    // memory mapped file
    int *normal_address =            (int*)0x10203040;
    *normal_address = 6;             //write: 0.00002sec (for example)
    int get_value = *normal_address; //read: 0.000001sec (for example)
    

    备注:

    我的应用程序是使用C ++和Windows API编写的。两种方法(内存映射文件和命名共享内存)都使用以下函数:

    CreateFileMapping
    
    OpenFileMapping
    MapViewOfFile
    
    • 主应用程序将每天更新,因此最终可能会出现nullptr或其他内容。源代码有点旧,将由多人更新。

    • 辅助应用程序将创建一次,除非需要,否则永远不会更新。因此,没有理由相信如果代码编写良好,将来不会发生任何错误以使其崩溃。

    思考(如果需要,请忽略):

    也许辅助应用程序可以在没有同步的情况下备份数据:首先检索校验和,然后获取整个清单。如果校验和不匹配,则它会再次尝试。

    也许另一种选择是让辅助应用程序成为实际处理项目的人。

    1. 每次客户端更新项目时,更新将直接发送到第二个应用程序,该应用程序将处理更新,然后在客户端离开后将更新存储到数据库中。由于这个应用程序非常小,并且不会发生变化,因此确保它不会死亡非常简单。然而,主要的应用程序会不断变化,这就是为什么它最终可能会因为错误或类似的东西而使用空指针,并且突然死亡。

0 个答案:

没有答案