【问题标题】:Clean memory after getting an element from queue从队列中获取元素后清理内存
【发布时间】:2018-07-02 15:28:09
【问题描述】:

假设我们有以下情况:

我们在数据库中有 2-3 个表,其中包含大量数据(假设为 50-1 亿条记录),我们想要添加 2k 条新记录。但在添加它们之前,我们需要检查我们的数据库是否有重复项。因此,如果这 2k 包含我们在数据库中的记录,我们应该忽略它们。但是要确定新记录是否重复,我们需要两个表中的信息(例如,我们需要进行左连接)。 解决的思路是:一个任务或线程创建一个合适的数据进行比较,并将数据推送到队列中(按批次,而不是按记录),所以我们的队列(或并发队列)是一个全局变量。第二个线程从队列中获取批处理并查看它。但是有一个问题——内存在增长……

浏览完批次后如何清理内存?

附:如果 smb 对如何优化此过程有其他想法 - 请描述一下...

【问题讨论】:

  • 有什么理由不简单地将所有 2k 记录转储到临时表中并根据需要在服务器上使用 SQL 进行过滤?
  • 我会在 SQL Server 的存储过程中执行此操作。如果您需要创建临时表,请使用数据库中的视图。 SQL server 比 c# 应用程序更擅长管理内存。
  • 我认为它会更长......也许我弄错了。如果您想了解详细信息 - 我找不到完全重复的内容。我找到类似的记录,并根据其相似性执行一个或几个操作(在第一种情况下,我将更新现有记录,在第二种情况下创建新记录,第三个 - 忽略)。而且我没有确切的 2 个线程......我有一个创建 10k 的批处理,当我得到它时 - 我开始新任务。所以我尝试同时比较几个批次..

标签: c# .net database multithreading memory


【解决方案1】:

这不是您所问问题的具体答案,因为您所问的内容对我来说真的没有意义。

如果您要更新特定行:

INSERT INTO 表名(UniqueKey、columnname1、columnname2 等...) 值(UniqueKeyValue、value1、value2 等....) 在重复键上 更新 columnname1=value1、columnname2=value2 等...

如果没有,只需忽略/删除更新语句。

考虑到它会使用您想要唯一的任何字段的唯一索引,并且只需执行插入或更新,这将非常快。无需在单独的表格或任何东西中进行验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 2015-10-02
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多