LINUX.ORG.RU

Сообщения xanf

 

Выбор БД для хранения данных

Форум — Development

Задача - выбрать хранилище под хранение данных GPS/GSM-мониторинга.

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

Единственные операции над БД - 1) записать трек в БД 2) получить текущее местоположение объекта (последний трек) 3) получить все треки устройства за период с ... по ...

Данных может быть очень много. Основным спросом будут пользоваться данные за последний месяц-два. Остальные - по запросу, ожидание допустимо. Соответственно по моим мыслям они будут разбиваться на таблицы по месяцам, дальше в идеале хотелось бы иметь возможность изъять часть данных на другое хранилище (к примеру банально записать на DVD) не останавливая БД, когда возникнет потребность - опять же не останавливая БД подключить их обратно.

Смотрю в сторону MongoDB, ибо нравится отсутствие схемы (прекрасно для произвольных данных + частичные индексы). Но может есть что получше?

xanf
()

[C++] curl_multi + pthreads = segfault

Форум — Development

Стоит задача написания fastcgi-обработчика, который по запросу вытягивает некие данные из сети и отдает наружу. Данные необходимо получать параллельно. В среднем живет около 400-500 потоков, каждый тянет порядка 10 источников.

Проблема в том что похоже при такой конфигурации curl_multi рушит мне стек - приведенный ниже пример падает на совершенно случайных местах и случайными ошибками. Может кто-либо сталкивался с этим или хотя бы протестирует указанный код? У меня на curl 7.20 и amd64 - segfault в течении 1-5 секунд после запуска. Что самое печальное - под valgrind'ом сегфолтов нет, что очень затрудняет отладку (скорее всего тормозной valgrind не может обеспечить должный уровень concurrency потоков). Сам код:

#include <iostream>
#include <curl/curl.h>
#include <cstdlib>

#define THREADS 400
#define MULTI_COUNT 20

using namespace std;

static int writer(char *data, size_t size, size_t nmemb, std::string *buffer)
{
	int result = 0;
	if (buffer != NULL)
	{
		buffer->append(data, size * nmemb);
		result = size * nmemb;
	}
	return result;
}



void doCURL(CURLM* multi_handle, CURL** easy_handles, std::string *memory, char** envp) {
//	Query* queryParams = initQuery(envp);

	for (int i = 0; i < MULTI_COUNT; i++) {
		easy_handles[i]=curl_easy_init();
		curl_easy_setopt(easy_handles[i],CURLOPT_URL, "http://localhost/");
		curl_easy_setopt(easy_handles[i],CURLOPT_WRITEFUNCTION, writer);
		curl_easy_setopt(easy_handles[i],CURLOPT_TIMEOUT,15);
		curl_easy_setopt(easy_handles[i],CURLOPT_WRITEDATA,&memory[i]);
		curl_easy_setopt(easy_handles[i], CURLOPT_NOSIGNAL, 1);
		curl_multi_add_handle(multi_handle,easy_handles[i]);
	}

	int still_running = 0;
	while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running));

	while(still_running) {
		struct timeval timeout;
		int rc;

		fd_set fdread;
		fd_set fdwrite;
		fd_set fdexcep;
		int maxfd;

		FD_ZERO(&fdread);
		FD_ZERO(&fdwrite);
		FD_ZERO(&fdexcep);

		timeout.tv_sec = 1;
		timeout.tv_usec = 0;


		CURLMcode res = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
		if (res) {
			std::cout << "You are doomed: "<< curl_multi_strerror(res) << "\n";
		}

		if (maxfd != -1) {
			rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);

			switch(rc) {
			case -1:
			break;
			case 0:
			default:
				while(CURLM_CALL_MULTI_PERFORM ==
						curl_multi_perform(multi_handle, &still_running));
				break;
			}
		}
		int run;
        while (NULL != curl_multi_info_read(multi_handle,&run)) ;
	}
}


static void* thread_main(void* a) {
	/*static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
	pthread_mutex_lock(&accept_mutex);
	curl_global_init(0);
	pthread_mutex_unlock(&accept_mutex);
	*/

	std::string* memory = new std::string[MULTI_COUNT];
	CURL** easy_handles = new CURL*[MULTI_COUNT]; //создаем массив хэндлов


	for (;;) {
		CURLM* multi_handle = curl_multi_init();
		doCURL(multi_handle, easy_handles,memory, NULL);
		for (int i = 0; i < MULTI_COUNT; i++) {
			memory[i].clear();
			curl_multi_remove_handle(multi_handle, easy_handles[i]);
			curl_easy_cleanup(easy_handles[i]);
		}
		curl_multi_cleanup(multi_handle);
	        sleep(1);
        }
	return NULL;
}


int main(int argc, char* const argv[] ) {
	pthread_t* id = new pthread_t[THREADS];
	for (int i = 1; i < THREADS; i++) {
		pthread_create(&id[i], NULL, thread_main, NULL);
		if (i % 50 == 0) {
			std::cout <<"50 spawned"<<std::endl;
		}
	}
	std::cout <<"ALL spawned"<<std::endl;
	thread_main(0);

	return 0;
}

Если у вас не сегфолтится - попробуйте убрать sleep.

 

xanf
()

Событие «TAP» на трекпойнте [ Sony Vaio P ]

Форум — Linux-hardware

Собственно поставил ArchLinux на Sony Vaio P В принципе все работает, из нерешенных - проблема Альсы с внутренним микрофоном и собственно сабж - очень хочется настроить событие «удара» по трекпойнту (он же «pointing stick», он же клитор). Сейчас устройство работает через evdev, но тап игнорируется, хотя если сделать cat /dev/input/event7 то при тапе видна реакция. Сейчас ксорг сконфигурен так (лень было через HAL, поэтому AutoAddDevices = false)

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "evdev"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/input/event7"
EndSection
Мышка бегает, но тапа нет. Синаптикс поднять на этом устройстве не удалось. Подскажите куда копать

xanf
()

[PERL] Синхронизация процессов

Форум — Development

Есть несколько процессов, запущенных одновременно, и стоит задача обеспечить выполнение одной процедуры только одним процессом в любой момент времени.

Сейчас это реализовано путем экслюзивного flock() в начале процедуры, и его снятием в конце.

Работает как надо, но есть проблема - когда "ждут" несколько потоков, то при его отпускании почему-то лок отдается последнему процессу который стал в очередь на этот лок, а хочется организовать здоровую очередь (т.е. первым стал в очередь, первым получил лок). В случае с fork я бы использовал Thread::Queue, а есть ли красивые методы решения этой проблемы, или прийдется писать свои костыли?

 

xanf
()

[хочется странного][wikimapia]«Большой» виртуальный экран

Форум — Talks

Вобщем захотелось мне «выдрать» из викимапии все объекты в своем городе. Посмотрел на сниффер, но понять «с наскоку» логику запросов не удалось. В связи с этим родилась безумная идея - создать большой виртуальный экран, открыть в нем викимапию и посмотреть куда пойдет запрос джаваскриптовый (судя по поведению все данные выдираются одним запросом). Однако банальная выходка:

$ vncserver -geometry 24000x24000
Не удалась, получаю ошибку:
Couldn't add screen
Если убрать астрономическую геометрию - все работает. ЛОР, подскажи как придумать?

 

xanf
()

Передать сообщение в screen

Форум — Admin

Задача: есть некая софтина запущенная в screen. Хочется передать ей из "обслуживающего" скрипта некую строку так, будто она введена с клавиатуры. Реально ли?

xanf
()

RSS подписка на новые темы