Добре, отже, це дещо від інших відповідей, але ... мені здається, що якщо у вас є дані у файловій системі (можливо, один запас на файл) із фіксованим розміром запису, ви можете отримати дані дуже просто: отримавши запит для певного запасу та часового діапазону, ви можете шукати потрібне місце, отримати всі потрібні дані (ви точно будете знати, скільки байтів), перетворити дані у потрібний формат (що може дуже швидко, залежно від формату вашого сховища), і вас немає.
Я нічого не знаю про сховище Amazon, але якщо у вас немає нічого подібного до прямого доступу до файлів, ви могли б, в основному, мати краплі - вам потрібно було б збалансувати великі краплі (менше записів, але, можливо, зчитування більше даних, ніж вам потрібно кожна час) з невеликими краплями (більше записів дає більше накладних витрат і, можливо, більше запитів на їх отримання, але щоразу повертається менше марних даних).
Далі ви додаєте кешування - я б запропонував надати різним серверам різні запаси для обробки, наприклад - і ви можете в значній мірі просто обслуговувати з пам'яті. Якщо ви можете дозволити собі достатньо пам'яті на достатній кількості серверів, обійдіть частину "навантаження на вимогу" і просто завантажте всі файли під час запуску. Це спростило б ситуацію за рахунок повільнішого запуску (що, очевидно, впливає на відмову, якщо ви не можете дозволити собі завжди мати два сервери для будь-якого конкретного запасу, що було б корисно).
Зверніть увагу, що вам не потрібно зберігати символ запасу, дату або хвилину для кожного запису - оскільки вони неявно містяться у файлі, який ви завантажуєте, і в позиції у файлі. Ви також повинні подумати, яка точність вам потрібна для кожного значення, і як це ефективно зберігати - у своєму питанні ви вказали 6SF, які ви могли б зберегти у 20 бітах. Потенційно зберігайте три 20-бітові цілі числа у 64 бітах сховища: прочитайте їх як long
(або будь-яке ваше 64-бітове ціле значення) і використовуйте маскування / зсув, щоб повернути його до трьох цілих чисел. Звичайно, вам потрібно буде знати, який масштаб використовувати - який ви, мабуть, могли б закодувати в запасні 4 біти, якщо не можете зробити його постійним.
Ви ще не сказали, на що схожі інші три цілочисельні стовпці, але якщо ви могли б уникнути 64 біт і для цих трьох, ви могли б зберегти цілий запис у 16 байтах. Це всього ~ 110 ГБ для всієї бази даних, що насправді не дуже багато ...
РЕДАГУВАТИ: Інша річ, яку слід врахувати, полягає в тому, що, мабуть, запаси не змінюються ні на вихідних, ні навіть на ніч. Якщо фондовий ринок відкритий лише 8 годин на день, 5 днів на тиждень, то вам потрібно лише 40 значень на тиждень замість 168. На той момент у ваших файлах може бути лише близько 28 ГБ даних у ваших файлах ... що звучить набагато менший, ніж ви, мабуть, спочатку думали. Наявність такої кількості даних у пам’яті є цілком розумним.
EDIT: Я думаю, я пропустив пояснення, чому такий підхід тут добре підходить: у вас є дуже передбачуваний аспект для більшої частини ваших даних - біржова інформація, дата та час. Виразивши індикатор один раз (як ім'я файлу) і залишивши дату / час повністю неявними в позиції даних, ви видаляєте цілу купу робіт. Це трохи схоже на різницю між a String[]
та a Map<Integer, String>
- знаючи, що ваш індекс масиву завжди починається з 0 і зростає з кроком до 1 до довжини масиву, дозволяє швидкий доступ та більш ефективне зберігання.