Подтвердить что ты не робот

С# - Большой накопитель

В настоящее время я сталкиваюсь с проблемой сглаживания головы, я работаю с большим набором данных (когда я говорю "большой", я имею в виду миллиарды строк данных), и я попадаю между скоростью и масштабируемостью.

Я могу хранить миллиарды строк данных в базе данных, но моему приложению необходимо постоянно проверять, существует ли в наборе данных новая строка данных, если нет, вставьте ее, в противном случае извлеките ее.

Если бы я использовал решение для базы данных, я бы оценил каждый вызов базы данных, чтобы получить строку данных в 10 мс (оптимистичная оценка), мне нужно получить около 800 тыс. записей для каждого файла, который я обрабатываю в своем приложении, это означает (10ms x 800k = 2.22 hours) для каждого файла для обработки. Этот промежуток времени слишком длинный, чтобы анализировать и обрабатывать 1 файл, учитывая, что время, необходимое для извлечения строки данных из базы данных, будет увеличиваться, когда база данных вырастет до миллиардов и миллиардов строк.

Я также подумал о сохранении List или HashSet в локальной памяти для сравнения и извлечения, но он не будет работать, поскольку я не смогу хранить миллиарды записей (объектов) в память.

Посоветуйте мне, что я должен сделать для своей ситуации.

Изменить: О, я забыл указать, что я уже реализовал полу кеш, как только запись будет восстановлена, он будет кэшироваться в памяти, поэтому, если одна и та же запись должна быть восстановлена ​​снова, это будет вместо этого извлекается из памяти, но я сталкиваюсь с одной и той же проблемой, я достигнет момента времени, когда память больше не сможет больше кэшировать данные.

4b9b3361

Ответ 1

В идеале, если вы играете с большим количеством данных, вам необходимо убедиться, что при обработке ваших данных не осталось ресурсов. Однако вам просто нужно найти разумный способ увеличить использование ваших ресурсов.

Я бы определенно пошел с базой данных, потому что это самый известный способ наиболее удобного запроса и хранения данных. Вы не указали, что именно делает ваше приложение, поэтому я могу просто дать вам общее мнение о том, как я буду делать в таком сценарии;

  • Если размер данных вашей базы данных действительно большой, как вы говорите в миллиардах, и если вы читаете данные для аналитических целей или отчетов, вам лучше найти технику интеллектуального анализа данных, например кубы и т.д. Это поможет вам структурировать ваши данные таким образом чтобы сократить время запроса.
  • Если выше не вариант, найдите способ горизонтальной или вертикальной разбивки ваших данных, это также зависит от того, как вы действительно извлекаете данные и как их можно группировать вместе.
  • Найти способ запроса группы строк (например, где pk в (1,2,3,4,..., 100) вместо запроса каждой строки в момент, как вы упомянули ранее, группировка может увеличить ответ запроса в экспоненциальным образом.
  • Лучше всего найти первичный ключ в самих данных, чтобы ваши данные были отсортированы по порядку вашего первичного ключа физически, и вы узнаете свой первичный ключ, прежде чем вставлять его. Однако, если вы не запрашиваете первичный ключ, лучше разместить индексы разумных индексов для увеличения времени ответа на запрос.
  • Храните соединение с базой данных в течение всего срока службы приложения и повторно подключайтесь только в случае его удаления. и использовать пул соединений, если ожидается несколько подключений к базе данных.