Находящееся на диске динамическое выделение памяти

Возможные проблемы:

  • Пользователь, запустивший crontab (root, you, ???) и его системные разрешения
  • ruby версия и notify-send в этом пользователе PATH
  • Не указывать переменную DISPLAY в вашем cron

Попробуйте это (измените число на правильное значение DISPLAY) ->

*/5 * * * * DISPLAY=:0 ruby ~/software_dev/scripts/new_script.rb

[ 1111] Может быть полезно: https://unix.stackexchange.com/questions/10121/open-a-window-on-a-remote-x-display-why-cannot-open-display [ 1111]

12
задан e.James 20 April 2009 в 21:22
поделиться

11 ответов

Ваши две цели - уменьшить использование памяти и сохранить ваши данные. Это определенно звучит как работа для базы данных . Но тогда вы говорите

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

Думаю, вас заинтересует отличительная особенность SQLite (очень легкая кроссплатформенная база данных с открытым исходным кодом):

Записи переменной длины

...

SQLite, напротив, использует только тот объем дискового пространства, который действительно необходим хранить информацию в ряд. Если вы храните один символ в VARCHAR (100), то только используется один байт дискового пространства. (На самом деле два байта - есть некоторые накладные расходы в начале каждого столбец, чтобы записать его тип данных и длина.)

Это также хороший выбор для встраиваемых разработок :

Встроенные устройства и приложения

Поскольку база данных SQLite требует мало или нет администрации, SQLite хороший выбор для устройств или услуг это должно работать без присмотра и без человеческая поддержка. SQLite хорошо подходит для использования в мобильных телефонах, КПК, телеприставках коробки и / или приборы. Это также хорошо работает как встроенная база данных в загружаемые пользовательские приложения.

8
ответ дан 2 December 2019 в 06:10
поделиться

Я реализовал свой собственный менеджер памяти, который использует распределение памяти приятеля и размеры блоков степеней два. Я убежден, что это правильно и не имеет утечки, объединяет свободные блоки и может выполнить дефрагментацию «останови мир».

Это отличный первый шаг. Если у вас есть работающий пользовательский распределитель памяти, вы, конечно, можете добиться большего!

Проблема в том, что, как и ожидалось, существует довольно много внутренней (мощность 2 блоков) и внешней фрагментации. Я' Я не эксперт в этой области, и хотя я нахожу это наглядным (я все еще студент), мне интересно, есть ли другие реализации, которые сделали то же самое или подобное? Конечно, я не могу быть единственным?

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

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

Если возможно, просмотрите ссылки, упомянутые в конце этой статьи. Они также могут дать дополнительную информацию.

8
ответ дан 2 December 2019 в 06:10
поделиться

Я бы определенно использовал mmap для ввода / вывода. Это упростит прямой доступ к данным и их сброс на диск при необходимости. Единственное, что вам нужно будет контролировать, это то, где файл отображается в адресном пространстве, так что вы можете перемещать его.

Одна из возможностей управления памятью - создать отдельный файл для каждого объекта и использовать уровень файловой системы. дефрагментация, а не ее реализация самостоятельно. Вы никогда не упоминали, какую ОС / файловую систему вы используете, но если бы в ней уже была онлайн-дефрагментация, я бы использовал это. Если вы используете Linux и можете использовать XFS, вы можете использовать xfs_fsr . Я ожидаю, что дефрагментация файловой системы будет сильно оптимизирована, и это потребует гораздо меньше усилий, чем самостоятельная реализация в одном большом файле.

1
ответ дан 2 December 2019 в 06:10
поделиться

Для встроенных устройств я, конечно, сделал бы простую реализацию вместо того, чтобы использовать базу данных. Файл прямого доступа IO избегает немного служебных из баз данных. И ресурсы часто ограничиваются во встроенных средах.

Ваша идея, пишущий средство выделения памяти является, вероятно, лучшим способом. Это должно обеспечить некоторый уровень API, который изолирует основанное на файле управление памятью как можно больше от остальной части Вашего приложения. Тем путем должно быть легко выгрузить (никакая предназначенная игра слов) для другой реализации позже и поэтому оптимизировать, если потребность возникает.

1
ответ дан 2 December 2019 в 06:10
поделиться

Недавно я закодировал класс виртуальной кучи для проблемы с высоким использованием памяти что у меня было. Код написан на LGPL и размещен на code.google.com по адресу:

http://code.google.com/p/kgui/source/browse/trunk/vheap.cpp

http: // code.google.com/p/kgui/source/browse/trunk/vheap.h

E по существу это работает следующим образом:

1) Определите размер блока и количество блоков, которые нужно оставить в памяти, и имя файла для кэширование в файловую систему. В моем случае использования у меня есть 200 блоков по 1 МБ памяти в любое время.

2) Затем вызовите Allocate, чтобы зарезервировать часть «виртуальной памяти». Вам возвращают 8-байтовую «ручку» в память. При желании вы можете выделить куски больше, чем размер блока.

3) Для записи в «виртуальную кучу» есть функция записи, в которой вы передаете «дескриптор», указатель на данные и размер данных.

4) Для чтения из «виртуальной кучи» есть функция чтения, в которой вы передаете «дескриптор», указатель на место назначения и размер данных для чтения.

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

указатель на место назначения и размер данных для чтения.

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

указатель на место назначения и размер данных для чтения.

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

2
ответ дан 2 December 2019 в 06:10
поделиться

Лучшим вариантом будет быстрое хранилище значений ключей . Преимущество над RDBMS заключается в том, что вам не понадобятся все накладные расходы на базу данных.

3
ответ дан 2 December 2019 в 06:10
поделиться

I think you'd have less internal fragmentation with a simple heap allocator. You just allocate the amount of memory you actually use (plus the overhead for the header). If you're already resigned to doing stop-the-world compaction, you could combine this with new arena allocation, and allocate a new (larger) arena and copy all your live blocks to the new arena.

0
ответ дан 2 December 2019 в 06:10
поделиться

Дон Вы не знаете, какую СУБД вы используете, но в MySQL вы можете использовать GROUP_CONCAT:

SELECT
  p.name,
  GROUP_CONCAT(c.name SEPARATOR ', ') AS categories
FROM
  product p
  JOIN product_to_category pc ON p.id = pc.product_id
  JOIN category c ON c.id = pc.category_id
GROUP BY
  p.name
ORDER BY
  p.name,
  c.name
- 121 --- 4718496--

Чтобы следовать ответу SpoonMeiser, вот конкретный пример:

$cat ./reviveself

#!/bin/bash

# save my process ID
rspid=$$

# schedule my own resuscitation
# /bin/sh seems to dislike the SIGCONT form, so I use CONT
# at can accept specific dates and times as well as relative ones
# you can even do something like "at thursday" which would occur on a 
# multiple of 24 hours rather than the beginning of the day
echo "kill -CONT $rspid"|at now + 2 minutes

# knock myself unconscious
# bash is happy with symbolic signals
kill -SIGSTOP $rspid

# do something to prove I'm alive
date>>reviveself.out
$
- 121 --- 866183--

Это не плагин Rails, но http://www.owasp.org/ - хорошее место для начала.

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    int num = GetKeyValue(e.KeyValue);  
}
- 121 --- 3780733--

Вывести во временную строку, затем перевернуть ее, затем перевернуть отдельные числа:

string ret;
for(int i=0;i<atoi(argv[1]);i++)
  ret += " " + itoa(i);

for(int i=0;i<ret.length()/2;i++)
   exchange(ret[i],ret[ret.length()-i-1]);

for(const char* t=&ret[0];t&&strchr(t,' ');t=strchr(t,' '))
for(int i=0;i<(strchr(t,' ')-t)/2;i++)
   exchange(t[i],t[strchr(t,' ')-t-1]);

printf(ret.c_str());
- 121 --- 2227183--

На самом деле вы должны оставить эти dbo , операторы, потому что ваш SQL будет быстрее, так как оптимизатору не нужно искать схему

Также проверьте эту ссылку Влияние на производительность вызовов процедур без квалификации владельца

- 121 --- 1884550--

Посмотрите на HDF5 http://www.hdfgroup.org/HDF5/whatishdf5.html

Это должно служить вашей цели.

1
ответ дан 2 December 2019 в 06:10
поделиться

Хммм. Это звучит как очень распространенный вариант использования BDB (Berkeley DB). Это эффективная библиотека производственного качества, которая создает постоянные «базы данных» с ключами-значениями (~ = таблицы с другими БД), с открытым исходным кодом и т. Д.

Я не думаю, что реляционные (SQL) БД имеют большой смысл, но bdb et al (gnu db, и я уверен, что есть другие), безусловно, делает.

0
ответ дан 2 December 2019 в 06:10
поделиться

Я собираюсь повторить kgiannakakis - вы описываете файловую систему, не система управления памятью.

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

0
ответ дан 2 December 2019 в 06:10
поделиться

Насколько я понимаю, вам нужна файловая система, а не система распределения памяти. Во-первых, во встраиваемых системах динамическое распределение памяти на диске - термин противоречивый. Диск, будь то жесткий диск или флэш-устройство, используемый для постоянного хранения, сильно отличается от памяти. Дело не только в том, как вы к нему обращаетесь, но и в том, что дисковое хранилище не на 100% надежно. При записи на диск вам нужно иметь алгоритм, позволяющий избежать плохих секторов. Вы думали об этом или можете считать, что ваш диск исправен?

Файловая система будет иметь дело как с распределением пространства, так и с проблемами с поврежденными секторами. FAT обычно используется во встроенных устройствах. Хотя производительность фрагментации FAT довольно низка, это не помешало ее использованию во многих встроенных устройствах. Большинство устройств на базе флеш-памяти фактически используют FAT.

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

1
ответ дан 2 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: