2013-07-12 2 views
2

Я программирую в C и используя bash как свою оболочку. В настоящее время я пытаюсь оптимизировать, когда запускаю свою программу. Общий смысл программы заключается в том, чтобы ввести некоторые параметры, прочитать в файле данных, а затем программа выполняет некоторые вычисления на основе входных параметров и данных из файла. Я часто запускаю этот код по 100 раз за раз, изменяя только входные параметры для каждого прогона, а не данные из файла. Я делаю это с использованием сценария оболочки для xargs исполняемого файла с различными параметрами.Повторное использование/сохранение чтения в массивах данных между прогонами в C

printf "%s\n" {0..n} | xargs -P 8 -n 1 ./program

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

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

+2

Я бы удостоверился, что файл данных оптимизирован для быстрого чтения (т. Е. Вместо того, чтобы обрабатывать любой из них). Вы можете изучить 'fork()', где родительский процесс считывает данные и «автоматически» передает его дочерним процессам. Родитель должен был бы нести ответственность за вызов ребенка сколько угодно раз и с разными аргументами. –

+2

Еще одна возможность - использовать общую память - сначала запустить одну программу, которая считывает данные и создает общий вид. Другая программа может отображать эту общую память и обрабатывать ее, а также удалять ее, когда это будет сделано. Наконец, первый процесс может затем освободить эту память. –

+1

Хороший вопрос. Мне нелегко ответить, хотя я предполагаю, что можно запустить демон, который хранит данные в сегменте разделяемой памяти. Я правильно делаю вывод, что ваш файл данных занимает намного больше 1 секунды, чтобы загрузить при первом запуске вашей программы? Это займет 1 секунду только после того, как система заменила файл на память? – thb

ответ

1

Вы можете попробовать хранить файл в совместно используемой памяти:/DEV/ГИМ

Ex: Ls>/DEV/ГИМ/LS-вывода

< ./program/DEV/ГИМ/LS-вывода

Не уверен, что это то, что вы искали, но что-то по этой линии может быть полезно, я думаю.

0

Я не знаю ответа на ваш вопрос, но это решит вашу проблему, если бы вы могли только коаксировать файловую систему, чтобы сохранить файл в сегменте разделяемой памяти, а затем опубликовать указатель и идентификатор сегмента, необходимые для доступа к файлу в памяти. See this kernel document, и this one, тоже. Они могут помочь.

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

Смежные вопросы