Физический размер базы данных не имеет значения. Количество записей не имеет значения.
, По моему опыту, самой большой проблемой, в которой Вы собираетесь работать к, не является размер, но количество запросов, которые можно обработать за один раз. Скорее всего, Вы оказываетесь перед необходимостью перемещаться в основную/ведомую конфигурацию так, чтобы запросы чтения могли работать против ведомых устройств и запросов записи, выполненных против ведущего устройства. Однако, если Вы еще не готовы к этому, можно всегда настраивать индексы для запросов, которые Вы выполняете для ускорения времени отклика. Также существует большая тонкая настройка, можно сделать к сетевому стеку и ядру в Linux, который поможет.
я имел, мои получают до 10 ГБ только с умеренным количеством соединений, и оно обработало запросы очень хорошо.
я сфокусировался бы сначала на Ваших индексах, затем сделать, чтобы администратор сервера посмотрел на Вашу ОС, и если все, что не помогает ей, могло бы быть пора реализовать основную/ведомую конфигурацию.
Для этого есть встроенный gcc: void * __builtin_return_address (unsigned int level)
См. http://gcc.gnu.org/onlinedocs/gcc/ Return-Address.html
На некоторых архитектурах вы можете найти его в стеке относительно первого параметра. Например, на ia32 параметры помещаются (в обратном порядке), а затем выполняется вызов, который отправляет адрес возврата. Помните, что стек почти всегда (и на ia32) растет вниз . Хотя технически вам нужны ABI или соглашения о вызовах (иногда называемые соглашениями о связях ) для вашего языка и аппаратной платформы, на практике вы обычно можете догадаться, если знаете, как машина вызова процедуры op работает.
Связь между первым параметром функции и позицией адреса возврата в стеке с гораздо большей вероятностью будет надежно фиксированным значением, чем связь между локальным адресом и адресом возврата. Однако вы, безусловно, можете распечатать адрес локального и первого параметра, и вы часто найдете ПК прямо между ними.
$ expand < ra.c
#include <stdio.h>
int main(int ac, char **av) {
printf("%p\n", __builtin_return_address(0));
return 0;
}
$ cc -Wall ra.c; ./a.out
0xb7e09775
$
Когда вы объявляете локальные переменные, они также находятся в стеке - например, x.
Если вы затем объявляете int * xptr
и инициализируете его значением & x
, он будет указывать на x.
Ничто (сильно) не мешает вам уменьшить этот указатель, чтобы заглянуть немного раньше, или увеличить его, чтобы посмотреть позже. Где-то поблизости есть ваш обратный адрес.
Чтобы узнать, где находится адрес возврата, вам необходимо знать, что такое соглашение о вызовах . Обычно это устанавливается компилятором и зависит от платформы, но вы можете принудительно установить его специфичными для платформы способами, например, используя __ declspec (stdcall)
в Windows. Оптимизирующий компилятор может также изобрести собственное соглашение о вызовах для функций, не имеющих внешней области видимости.
Запрет на использование встроенных программ компилятора для получения адреса возврата, вам придется прибегнуть к встроенному ассемблеру для получения значения. Другие методы, которые кажутся работающими при отладке, могут быть очень уязвимы для оптимизации компилятора, которая их испортит.
Вы можете исследовать стек следующим образом
// assuming a 32 bit machine here
void digInStack(void) {
int i;
long sneak[1];
// feel free to adjust the search limits
for( i = -32; i <= 32; ++i) {
printf("offset %3d: data 0x%08X\n", i, sneak[i]);
}
}
Вы это может сойти с рук, потому что C известен тем, что не очень конкретен в том, как вы индексируете массив. Здесь вы объявляете фиктивный массив в стеке, а затем просматриваете +/- относительно него.
Как заметил Роб Уокер, вам определенно нужно знать соглашение о вызовах вашего компилятора, чтобы понимать данные, на которые вы смотрите. Вы можете распечатать адрес нескольких функций и искать значения, которые находятся в аналогичном диапазоне, и интуитивно понять, где находится адрес возврата,
Также обратите внимание, что в целом язык C не гарантирует, что ваш обратный адрес находится в стеке или вообще где-либо в ОЗУ.
Там - это архитектуры процессоров, которые хранят адрес возврата в регистре, обращаясь к ОЗУ только тогда, когда вызовы начинают вкладываться. Существуют и другие архитектуры, где есть отдельный стек для адресов возврата, который не читается ЦП. Для обоих из них все еще могут быть реализованы компиляторы C.
Вот почему вам нужно быть более ясным с вашей средой.