Я пытаюсь объединить данные из 9 csvs, которые все связаны друг с другом в одну базу данных.
Проблема, с которой я столкнулась, - это базовая система csv, имеющая 5 миллионов записей, и для получения еще одной полной записи требуется информация для других 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 - из транспортного средства.
Моя цель - создать коллекцию в моей базе данных монго, состоящей из транспортных средств
Vehicle {
vehicle_id,
engine_id,
maintenance {
description,
name,
}
schedules [
schedule {
name,
description,
date,
}
]
}
Сейчас я загружаю csvs с помощью С#, создавая для них коллекции в mongo и классы для них в С#, затем я просматриваю коллекцию транспортных средств (все 5 миллионов записей) и запрашиваю все другие коллекции для создания завершенных машина запись.
Но это занимает слишком много времени, и также слишком много времени требуется для запроса отдельного автомобиля "на лету" вместо того, чтобы собирать всю коллекцию автомобилей перед началом работы. Мне интересно, есть ли быстрый способ объединения чрезвычайно больших коллекций или более быстрый способ запроса.
Я нашел, что самым быстрым решением было создание базы данных sql с различными таблицами для каждого типа (Транспортные средства, Поиск и т.д.). Когда я только загрузил все данные и запросил кучу соединений, потребовалось более минуты. Но создавая ссылки на внешние ключи, индексы и добавляя первичные ключи к таблице, я получил ее до менее чем за секунду. Поэтому я создаю запрос из моего кода С# и возвращаю объект, содержащий всю необходимую информацию из каждой таблицы.
Хотя я не знаком с 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.
Наконец, вам нужно загрузить данные из базы csv с engine = engine_list[id_from_csv]
записей, построить составную запись, используя идентификатор в базовом файле, например engine = engine_list[id_from_csv]
, и сохранить его в db. Чтобы сделать это эффективно, вам придется разбить его на chuncks: загрузите 1000 или около того записей из базы csv, создайте и сохраните запись, освободите память и обработайте следующий фрагмент. Проверьте это сообщение SO для приятного объяснения использования памяти.
Извините, я не могу дать вам ответ, специфичный для MongoDB; этот ответ предполагает, что вы начинаете с csv и создаете записи БД, а не начинаете с записей MongoDB и создаете новую таблицу/записи. Надеюсь, это будет полезно, тем не менее. Удачи!