【问题标题】:Efficient methods of storing MySQL or JSON data in memory?在内存中存储 MySQL 或 JSON 数据的有效方法?
【发布时间】:2012-09-16 18:56:39
【问题描述】:

在默认支持和推荐无类型数据数组的 Javascript、AS3 和 Python 等平台中,数组通常是在内存中存储任意用户数据的最简单、最有效的方式。 (表格数据、CSV 数据、JSON 数据等)

.NET 然而,喜欢强类型格式的一切;您只是不能将任何内容转储到 List<object> 数组中,尽管它可以工作,但处理起来会更慢且更笨拙(类型检查,每次使用都进行类型转换)。因此,通常您最终将数据模式定义为一个类,其属性对应于列,并将数据存储在该类的实例中。

那么,在内存中存储任意数据的推荐方法是什么,尤其是当架构不断升级(例如 CSV 或 JSON)时,您在开发时无法“硬编码”。

编辑:此类数据可能包括数字(int/float)、字符串、日期、时间、单位、地理空间数据、几何数据、嵌入式文件,基本上是 MySQL 数据库或 JSON 文件可以存储的所有内容.

编辑:在内存中,这些数据可以并且将用于各种处理;生成图表的计算,通过子字符串搜索数据的字符串处理,地理空间/3D数据的数字运算算法等,验证脏数据和优化冗余数据的优化算法等。

【问题讨论】:

  • 数据存储后需要做哪些处理?
  • 您询问有关存储对象数组的问题,然后当您得到答案时您会发表评论,但这与静态定义类相比如何。问题是什么?
  • 记住,类型应该是你的朋友(帮助保护代码的正确性),而不是敌人(给模式更新带来问题等)。首先,关注你的问题,定义类型,然后思考如何存储它们。

标签: c# .net memory types formats


【解决方案1】:

一种可能的方法是使用Dictionary<string,object> 或考虑(4.0+)使用动态对象来存储单个项目。而不是再次将项目放入 List 或 Array 或 Dictionary 中。

在以太情况下,您可能还需要某种关于对象的元数据。 IE。属性名称到{类型、限制、验证规则、其他}映射。

【讨论】:

  • 这不会影响性能吗?动态对象在任何地方都像静态定义的类一样快吗?显然反射/IL 生成可用于在运行时定义类及其属性,尽管它有点棘手。
  • @Geotarget,一切都比inc eax 慢。它对您的情况是否足够快 - 由您来尝试和衡量。这里没有人可以就任何特定方法是否更适合您的情况提出建议。
【解决方案2】:

我不同意问题中的某些陈述。

首先,“你不能在object[] 中转储任何东西”。错误的!你可以在object[] 中转储任何东西,因为一切都是对象。你必须只能将它转换回你需要的任何东西。

第二,“它更慢”。又是假的!只要您知道在哪里查找,普通的旧数组是访问速度最快的集合。访问数组中的特定元素需要 O(1)。

如果您需要将 CSV 存储在 C# 类中,您可以考虑 System.Data.DataTable,但最通用的肯定是 object[],其中每个元素本身都可以是另一个 object[],达到您想要的深度级别。

如果您真的需要随机访问,您必须按照 Alexei 的说明选择 Dictionary<string,object>

编辑:这是一个例子

void ScanCollection(object[] collection)
{
    foreach (object item: collection)
    {
        if (item is string)
        ///Treat as string
        else if (item is float)
        ///Treat as float
        else if (item is SomethingElse)
        ///Treat as SomethingElse class

    }
}

【讨论】:

  • 很抱歉我谈到了object[],因为它几乎是不可变的(你不能调整它的大小或在两者之间轻松添加/删除元素)
  • 也许列表 可能有帮助?
【解决方案3】:

这里可能有几种方法。

您可以通过反射以编程方式创建类。

How to dynamically create a class in C#?

然后使用泛型集合和一些 LINQ to Objects 来查询数据。

或者,您可以从任何数据源即时使用或创建自己的数据源或数据表,并根据您的逻辑使其成为您喜欢的类型,如果它是数据库,您可以检查数据表列的类型。然后就可以用数据表对象的select方法查询数据表了。

【讨论】:

    【解决方案4】:

    在 .NET 中,您在哪里遇到过对象数组失败的情况?

    由于一个对象只支持 5 种方法,所以肉不多。

    Object Members

    据我所知,所有的集合支持对象。

        List<Object> lObjs = new List<object>();
        HashSet<Object> hObjs = new HashSet<object>();
        Dictionary<int, Object> dObjs = new Dictionary<int, object>();
        Object[] aObjs = new Object[10];
    
        aObjs[0] = "string";
        aObjs[1] = 1d;
        aObjs[2] = new object();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-13
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多