我正在尝试将来自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万条记录)并查询所有其他内容用于创建完整车辆记录的集合。
但这需要太长时间,而且在运行中查询单个车辆也需要很长时间,而不是事先建立完整的车辆集合。我想知道是否有一种快速的方法来组合极大的集合,或者更快的查询方式。
答案 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数据填充dictionaries或lists的帮助。
最后,您需要使用大量记录从基本csv加载数据,使用基本文件中的id(例如engine = engine_list[id_from_csv]
)构建复合记录,并将其存储在db中。为了有效地执行此操作,您必须将其分解为chuncks:从基本csv加载1000个左右的记录,创建并保存记录,释放内存并处理下一个块。查看this SO帖子,了解内存使用情况。
抱歉,我无法给你一个特定于MongoDB的答案;这个答案假设您从csv开始创建数据库记录而不是从MongoDB记录开始并创建新的表/记录。希望它仍然有用。祝你好运!
答案 1 :(得分:0)
我发现最快的解决方案是为每种类型创建一个包含不同表的SQL数据库(Vehicles,Lookups等)。当我刚刚加载所有数据并通过一堆连接查询时,它花了一分多钟。但是通过创建外键引用,索引和向表添加主键,我将其降低到不到一秒钟。所以我从我的c#代码创建查询,并从每个表中获取包含我需要的所有信息的对象。