Хорошо, так что это несколько отличается от других ответов, но ... мне кажется, что если у вас есть данные в файловой системе (возможно, одна папка на файл) с фиксированным размером записи, вы можете получитьдля данных действительно легко: учитывая запрос для определенного запаса и временного диапазона, вы можете искать в нужном месте, извлекать все необходимые данные (вы точно будете знать, сколько байтов), преобразовыватьданные в нужном формате (который может быть очень быстрым в зависимости от формата хранения), и вас нет.
Я ничего не знаю о хранилище Amazon, но если у вас нет ничего похожего на прямоедля доступа к файлам у вас могут быть в основном большие двоичные объекты - вам нужно сбалансировать большие большие двоичные объекты (меньше записей, но, вероятно, читая больше данных, чем нужно каждый раз) с небольшими большими двоичными объектами (чем больше записей, тем больше накладных расходов и, вероятно, больше запросов на них,но каждый раз возвращается меньше бесполезных данных).
Далее вы добавляете кеширование - я бы посоветовал предоставить различным серверам разные ресурсы для обработкиxample - и вы можете просто служить по памяти.Если вы можете позволить себе достаточно памяти на достаточном количестве серверов, обойдите часть «загрузка по требованию» и просто загрузите все файлы при запуске.Это упростит ситуацию за счет более медленного запуска (что, очевидно, влияет на аварийное переключение, если только вы не можете позволить себе всегда иметь двух серверов для какой-либо конкретной акции, что будет полезно).* Обратите внимание, что вам не нужно хранить символ акции, дату или минуту для каждой записи - потому что они подразумеваются в загружаемом файле и позиции в файле.Вам также следует подумать, какая точность вам нужна для каждого значения и как ее эффективно хранить - вы дали 6SF в своем вопросе, который вы можете хранить в 20 битах.Потенциально храните три 20-битных целых числа в 64-битном хранилище: считайте его как long
(или каким бы ни было ваше значение 64-битного целого) и используйте маскирование / сдвиг, чтобы вернуть его к трем целым числам.Вам, конечно, нужно знать, какую шкалу использовать - которую вы, вероятно, могли бы закодировать в свободные 4 бита, если не можете сделать ее постоянной.
Вы не сказали, что представляют собой три других целых числастолбцы похожи, но если бы вы могли обойтись с 64 битами для этих трех, вы могли бы сохранить целую запись в 16 байтов.Это всего ~ 110 ГБ для всей базы данных, что на самом деле не очень много ...
РЕДАКТИРОВАТЬ: Другая вещь, которую следует учитывать, это то, что предположительно акция не меняется в выходные или даже за ночь.Если фондовый рынок открыт только 8 часов в день, 5 дней в неделю, тогда вам нужно только 40 значений в неделю вместо 168. В этот момент вы можете получить только около 28 ГБ данных в ваших файлах ... что звучитнамного меньше, чем вы, возможно, изначально думали.Наличие такого большого количества данных в памяти очень разумно.
РЕДАКТИРОВАТЬ: я думаю, что я пропустил объяснение почему этот подход хорошо подходит здесь: выУ вас есть очень предсказуемый аспект для большей части ваших данных - биржевой тикер, дата и время.Выражая тикер один раз (в качестве имени файла) и оставляя дату / время полностью неявно в позиции данных, вы удаляете целую кучу работы.Это немного похоже на разницу между String[]
и Map<Integer, String>
- знание того, что индекс вашего массива всегда начинается с 0 и увеличивается с шагом 1 до длины массива, обеспечивает быстрый доступ и более эффективное хранение.