LINUX.ORG.RU

Массивы в LINUX


0

1

Помогите с ответом на вопрос:

Есть программа, ей требуется обработка большого массива в оперативной памяти. Код примерно такой: #include <stdio.h> #define SIZE 1000000 int main() { int a[SIZE];

printf(«%d», sizeof(a[SIZE]);

return 0; } Мне нужно увеличить SIZE до максимально возможной величины. Чем определяется ее ограничение? Как бы вы изменили программу?

Перемещено tazhate из admin

Чем определяется ее ограничение?

Размером стека в данном случае. Локальные переменные выделяются в стеке.

Как бы вы изменили программу?

Как минимум - сделал массив глобальным. А лучше - использовать calloc/malloc.

sergv
()
Ответ на: комментарий от Prog2012

само собой лучше чтобы он был динамический, но под «большой массив» я понял что он даже в оперативу может не влезть, и тут без помощи диска трудно обойтись

redixin ★★★★
()

мм, регистрируемся на лекции в Яндекс ? это пичаль,самостоятельно ни кто не хочет ни чего искать.

anonymous
()

Можно хранить это все в СУБД и обработать порционно, если сомневаетесь в своих силах.

Над абстрактными задачами сложно рассуждать о здравом смысле. Формулируйте живой пример и вам напишут 10 гораздо более простых и удачных вариантов.

BaBL ★★★★★
()

1. Используешь malloc или его аналоги.
2. Пишешь программу так, чтобы она использовала минимум памяти, которая ей нужна.
3. При выделении памяти проверяешь успешность операции.

Ибо В 99% случаев програму можно оптимизировать так, чтобы ей не нужно было гигабайт памяти.

Альтернативный вариант - не пиши программы, займись, например, шахматами.

P. S. А еще удивляются почему это приходится апгрейдить комп каждые 2-3 года.

Kroz ★★★★★
()
Ответ на: комментарий от Prog2012

Эти задачи неспроста там. Они нужны, чтобы отсеять не обладающих достаточными базовыми знаниями. У тебя их пока недостаточно, поэтому эти курсы будут для тебя пустой тратой времени.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Пустой тратой точно не станут. Я уверен. Да и вообще не хочется превращать ветку в обсуждения моей мотивации,целях и проч. Давайте вернемся к задачи.

Prog2012
() автор топика
Ответ на: комментарий от Prog2012

а и вообще не хочется превращать ветку в обсуждения моей мотивации,целях и проч

Форумом ошибся. А за наглые требования решения фактически экзаменов надо банить.

Artificial_Thought ★★★★
()
Ответ на: комментарий от Artificial_Thought

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

Prog2012
() автор топика
Ответ на: комментарий от Prog2012

...Я задал вопрос по решению конкретной задачи и спрашиваю мнения других о ее решении...

Сразу-же написал - стеком опредеяется. Дальше - дуй в гугл на предмет увеличения размера стека.

sergv
()
Ответ на: комментарий от i-rinat

Какие задачи? Дайте еще мне посмотреть.

urxvt ★★★★★
()
Ответ на: комментарий от Prog2012

Пустой тратой точно не станут. Я уверен. <...> Давайте вернемся к задачи.

А я уверен, так как задача-то элементарная. Она проверяет, знаешь ли ты C на достаточном уровне. Так как нельзя проверить весь объём знаний, знания проверяются выборочно. Ты найдёшь ответ на один-два вопроса и твой уровень знаний станет кривой 'x' на графике, то есть где-то ты понимаешь, а в остальных областях нет. Тогда как нужно иметь такую кривую целиком над 'o'.


      ^
      |
      |
      |                   xxx
      | oooooooooooooooooooooooooooooooooooooooooooo
      |                  x   x
      |                 xx   x
      |                xx    xx
      |               xx      x
      |              xx        x
      |           xxxx         xxx
      |  xxxxxxxxxx              xxxxxxxxxxxxxxxxxxx
      +------------------------------------------------------>

Ты выпросишь решение ещё одной задачи, появится второй пик. Но вот беда — этого тоже недостаточно. Таких пиков должно быть много, чтобы в сумме они перевалили за порог. Этого можно добиться либо целенаправленно изучая предмет, либо решая прикладные задачи. Много.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

Однако,не вижу в просьбе помочь с ответом на вопрос «выпрашивание ответов». Перед мной стояла задача, у меня были свои идеи,в частности с динамическим массивом. Мне было интересно узнать идеи мнения других. Кто захотел, тот поделился своими идеями,за что я им благодарен.

Prog2012
() автор топика
Ответ на: комментарий от Prog2012

...Однако,не вижу в просьбе помочь с ответом на вопрос «выпрашивание ответов»...

А он прав. Тут уровень базовых знаний о переменных в C.

sergv
()

неинтересные лабораторные здесь делают за деньги

anonymous
()
Ответ на: комментарий от Prog2012

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

anonymous
()
Ответ на: комментарий от Prog2012

По ТАКОМУ вопросу, каждый, кто хоть немного знает общие принципы прикладного программирования, оценит твои знания языка программирования Си, базовых понятий программирования, а также умения гуглить в 0 и будет абсолютно прав.

anonymous
()

В Си есть функция realloc. Она может увеличивать размер массива. Смысл такой, сначала выделяешь ею кусок памяти. Килобайт или мегабайт, смотря сколько у тебя данных. Потом, в цикле, во время заполнения массива, все время проверяешь, не подходишь ли ты к его концу, если да, то этой же функцией выделяешь в два раза больший блок, спокойно себе заполняешь массив дальше. Как подошел к концу, еще добавил кусок. И так далее.

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

Тред не читал.

rimsleur
()
Ответ на: комментарий от Prog2012

Не вижу ничего плохого в том,чтобы искать ответ\решать задачу и т.п. посредством форумов

В школу вали!

anonymous
()

Язабан

anonymous
()
Ответ на: комментарий от greek_31

просто — как вернёт malloc ENOMEM, так память и закончилась. узнавать заранее кол-во доступной памяти не имеет смысла, т.к. система многозадачная и не известно кто когда сколько памяти скушает или освободит.

beastie ★★★★★
()
Ответ на: комментарий от greek_31

При использование динамической памяти, как узнать её максимальный допустимый объем?

У меня сейчас на x86_64 получилось выделить 137295302488 байт, что-то около 127,866 терабайт. sbrk.

i-rinat ★★★★★
()
Ответ на: комментарий от Kroz

Ибо В 99% случаев програму можно оптимизировать так, чтобы ей не нужно было гигабайт памяти.

Лично я сталкивался с необходимостью (а точнее удобством) использовать Gb+ RAM только для обработки данных — когда удобнее один раз все засосать в оперативу, обработать и выгрузить обратно, ну и при создании сервисов напоминающих memcache.

PS: подозреваю, что под правильным ответом на вопрос ТС, подразумевается использование шаблона vector (что в большинстве случаев обычно разумно).

soomrack ★★★★★
()

Чем определяется ее ограничение?

Стеком, свободной памятью, vm.shmmax (и некоторыми другими переменными в vm), архитектурой процессора... Абсолютно полный и точный ответ дать затруднительно.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 1)
Ответ на: комментарий от beastie

как вернёт malloc ENOMEM ...

если malloc ENOMEM будет __возвращать__ (!) - реки потекут вспять, горы разрушатся с ошибкой сегментации и на земле настанет ад системных программистов

shty ★★★★★
()
Последнее исправление: shty (всего исправлений: 1)
Ответ на: комментарий от shty

__возвращать__ (!)

Не придирайся :) как и где вернётся enomem, знают те, кто читал man, а остальным тут уже не поможешь.

beastie ★★★★★
()
Ответ на: комментарий от Prog2012

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

Гхм... «Помогите, я хочу поступить на филологический факультет МГУ! Как правильно писать - кАрова или кОрова?»

Вы примерно в том же ключе выступаете... ;-)

Эффективное выделение памяти для обработки больших объемов данных это на самом деле не такой тривиальной вопрос, но решение зависит от решаемой задачи. А на том уровне, на котором Вы спросили - ничего кроме «надо Вам книжку почитать» в голову не приходит.

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.