从CSV创建和查询大型数据库

时间:2015-03-25 17:12:47

标签: c# mongodb linq csv database

我正在尝试将来自9个相互关联的csv的数据合并到一个数据库中。

我遇到的问题是基本csv有500万条记录,它需要其他8个大型csv的信息才能创建一条完整的记录,但创建此记录需要一分钟。

以下是问题的简化视图。

基本CSV代表车辆

Vehicle {
         vehicle_id,
         engine_id,
         maintenance_id
         veh_eng_maintenance_id,
}

其中maintenance_id是维护对象的主键,并且还有中间查找步骤。

Lookup
{
    lookup_id,
    veh_eng_maintenance_id,
    schedule_id,
}

其中schedule_id是来自另一个csv的计划对象的主键,veh_eng_maintenance_id来自车辆。

我的目标是在我的mongo数据库中创建一个由Vehicles

组成的集合
Vehicle {
         vehicle_id,
         engine_id,
         maintenance {
                      description,
                      name, 
                      }
          schedules [
                    schedule {
                              name,
                              description, 
                              date,
                             }
                    ]
          }

现在我正在使用c#加载csvs,在mongo中为它们创建集合,在c#中为它们创建类,然后我将浏览vehicle集合(所有500万条记录)并查询所有其他内容用于创建完整车辆记录的集合。

但这需要太长时间,而且在运行中查询单个车辆也需要很长时间,而不是事先建立完整的车辆集合。我想知道是否有一种快速的方法来组合极大的集合,或者更快的查询方式。

2 个答案:

答案 0 :(得分:0)

虽然我不熟悉MongoDB,但我猜测问题在于加载内存中太多的对象。我的方法是首先创建类来处理每个独特的数据:

public class engine
{
    public int id { get; set; }
    // other things...
}

public class maintenance
{
    public int id { get; set; }
    // other things...
}

public class Vehicle
{
    public int id { get; set; } // vehicle_id
    public engine engine { get; set; }
    public maintenance maint { get; set; }
}

然后我会使用这些类将csv中的辅助数据加载到字典中:

Dictionary<int, engine> engine_list = new Dictionary<int, engine>();
Dictionary<int, maintenance> maint_list = new Dictionary<int, maintenance>();

查看这些SO帖子,以获取有关从csv数据填充dictionarieslists的帮助。

最后,您需要使用大量记录从基本csv加载数据,使用基本文件中的id(例如engine = engine_list[id_from_csv])构建复合记录,并将其存储在db中。为了有效地执行此操作,您必须将其分解为chuncks:从基本csv加载1000个左右的记录,创建并保存记录,释放内存并处理下一个块。查看this SO帖子,了解内存使用情况。

抱歉,我无法给你一个特定于MongoDB的答案;这个答案假设您从csv开始创建数据库记录而不是从MongoDB记录开始并创建新的表/记录。希望它仍然有用。祝你好运!

答案 1 :(得分:0)

我发现最快的解决方案是为每种类型创建一个包含不同表的SQL数据库(Vehicles,Lookups等)。当我刚刚加载所有数据并通过一堆连接查询时,它花了一分多钟。但是通过创建外键引用,索引和向表添加主键,我将其降低到不到一秒钟。所以我从我的c#代码创建查询,并从每个表中获取包含我需要的所有信息的对象。