Создание и запрос большой базы данных из CSV

1

Я пытаюсь объединить данные из 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 миллионов записей) и запрашиваю все другие коллекции для создания завершенных машина запись.

Но это занимает слишком много времени, и также слишком много времени требуется для запроса отдельного автомобиля "на лету" вместо того, чтобы собирать всю коллекцию автомобилей перед началом работы. Мне интересно, есть ли быстрый способ объединения чрезвычайно больших коллекций или более быстрый способ запроса.

  • 0
    Вы можете использовать python или что-то подобное для создания сценария для базы данных и хранения записей о транспортных средствах с полным набором деталей, в отличие от создания 9 различных таблиц, связанных идентификаторами. Если вы действительно хотите, чтобы дополнительные таблицы существовали в базе данных, вы все равно можете их встроить и использовать для хранения уникальных данных технического обслуживания и т. Д., Чтобы упростить создание / редактирование записей транспортных средств.
  • 0
    Проблема в том, что данные начинаются как 9 отдельных csvs, которые все связаны, я не имею над этим контроля, и моя цель - собрать их в один, используя c #, но не занимать тысячу часов. Дополнительные таблицы не нужны, в настоящее время я только сохраняю их в mongo, поэтому у меня не хватает локальной памяти.
Показать ещё 4 комментария
Теги:
database
linq
csv

2 ответа

0
Лучший ответ

Я нашел, что самым быстрым решением было создание базы данных sql с различными таблицами для каждого типа (Транспортные средства, Поиск и т.д.). Когда я только загрузил все данные и запросил кучу соединений, потребовалось более минуты. Но создавая ссылки на внешние ключи, индексы и добавляя первичные ключи к таблице, я получил ее до менее чем за секунду. Поэтому я создаю запрос из моего кода С# и возвращаю объект, содержащий всю необходимую информацию из каждой таблицы.

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.

Наконец, вам нужно загрузить данные из базы csv с engine = engine_list[id_from_csv] записей, построить составную запись, используя идентификатор в базовом файле, например engine = engine_list[id_from_csv], и сохранить его в db. Чтобы сделать это эффективно, вам придется разбить его на chuncks: загрузите 1000 или около того записей из базы csv, создайте и сохраните запись, освободите память и обработайте следующий фрагмент. Проверьте это сообщение SO для приятного объяснения использования памяти.

Извините, я не могу дать вам ответ, специфичный для MongoDB; этот ответ предполагает, что вы начинаете с csv и создаете записи БД, а не начинаете с записей MongoDB и создаете новую таблицу/записи. Надеюсь, это будет полезно, тем не менее. Удачи!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню