2016-12-05 3 views
1

У меня есть скрипт python, которому необходимо загрузить большой файл с диска на переменную. Это занимает некоторое время. Сценарий будет вызываться много раз из другого приложения (все еще неизвестного), с разными параметрами, и будет использоваться stdout. Есть ли возможность избежать чтения большого файла для каждого отдельного вызова скрипта?Сохранение переменных Python между вызовами скрипта

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

+0

Вы можете попробовать подход, основанный на ответ [здесь] (http://stackoverflow.com/questions/6687660/keep-persistent-variables-in -Память-между-пробеги-оф-питон-скрипта). Если вы используете Python 3, 'reload' необходимо импортировать' from importlib import reload' –

ответ

1

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

Для одной машины поставляемые ОС трубы являются лучшим решением для того, что вы ищете.

По существу, вы создадите вечный процесс на python, который читает с канала, и обрабатывает команды, входящие в трубу, а затем печатает в sysout.

Ссылка: http://kblin.blogspot.com/2012/05/playing-with-posix-pipes-in-python.html

Из выше источника

Workload Для того, чтобы симулировать свою рабочую нагрузку, я придумал следующий простой сценарий под названием pipetest.py, который принимает имя выходного файла, а затем записывает некоторые текст в этот файл.

#!/usr/bin/env python 

import sys 

def main(): 
    pipename = sys.argv[1] 
    with open(pipename, 'w') as p: 
     p.write("Ceci n'est pas une pipe!\n") 

if __name__ == "__main__": 
    main() 

Кодекс В моем тесте, это «файл» будет FIFO создан мой код упаковщика. Реализация кода обертки заключается в следующем, я буду идти по коду подробно ниже на этой должности:

#!/usr/bin/env python 

import tempfile 
import os 
from os import path 
import shutil 
import subprocess 

class TemporaryPipe(object): 
    def __init__(self, pipename="pipe"): 
     self.pipename = pipename 
     self.tempdir = None 

    def __enter__(self): 
     self.tempdir = tempfile.mkdtemp() 
     pipe_path = path.join(self.tempdir, self.pipename) 
     os.mkfifo(pipe_path) 
     return pipe_path 

    def __exit__(self, type, value, traceback): 
     if self.tempdir is not None: 
      shutil.rmtree(self.tempdir) 

def call_helper(): 
    with TemporaryPipe() as p: 
     script = "./pipetest.py" 
     subprocess.Popen(script + " " + p, shell=True) 
     with open(p, 'r') as r: 
      text = r.read() 
     return text.strip() 

def main(): 
     call_helper() 

if __name__ == "__main__": 
    main() 
3

Сделать это (веб-) микросервис: формализовать все различные аргументы CLI в качестве конечных точек HTTP и отправлять запросы к нему из основного приложения.

1

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

>>> import pickle as p 
>>> mystr="foobar" 
>>> p.dump(mystr,open('/tmp/t.txt','wb')) 
>>> mystr2=p.load(open('/tmp/t.txt','rb')) 
>>> mystr2 
'foobar' 
+0

Я думаю, я сделал это не так ясно. Происходит не так много обработки. Но читать с жесткого диска и помещать его в ОЗУ занимает некоторое время. – NoMorePen

1

Поскольку вы уже можете прочитать данные в переменную, то вы могли бы рассмотреть память отображения файла с помощью mmap. Это безопасно, если несколько процессов только считывают его - для поддержки писателя потребуется протокол блокировки.

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

Когда вы читаете файл в память, маловероятно, что он все загружен в ОЗУ, он будет выгружен, когда «реальная» ОЗУ становится чрезмерно подписанной. Часто этот пейджинг является значительным накладным. Файл с отображением памяти - это всего лишь ваши данные «готов к выходу». Нет никаких накладных расходов при чтении в память (virtual памяти, то есть), он есть, как только вы его сопоставляете.

Когда вы пытаетесь получить доступ к данным, возникает ошибка . происходит, и подмножество (страница) загружается в ОЗУ - все это делается операционной системой, программист не знает об этом.

Пока файл остается на карте, он подключен к пейджинговой системе. Другой процесс, сопоставляющий один и тот же файл, будет обращаться к одному и тому же объекту, если изменения не были выполнены (см. MAP_SHARED).

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

Другие процессы открывают файл (используйте os.open()) и сопоставьте объект.

Смотрите примеры в документации, а также hereGiving access to shared memory after child processes have already started

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