Я пытаюсь оптимизировать мой код для чтения молекул, но, думаю, я не очень хорошо справляюсь с этой задачей.В моем примере я должен прочитать базы данных ChEMBL и Zinc.ChEMBL может быть загружен в 1 файл SDF, а Zinc (лучший способ, который я могу загрузить) разделен на несколько файлов SDF.GZ.Я думаю: быстрее читать 1 файл SDF вместо нескольких файлов SDF (из-за времени ввода-вывода), но как прочитать этот файл 1 SDF с миллионами молекул и обрабатывать их параллельно?С несколькими SDF я могу вызвать N рабочих мест / рабочих, чтобы каждый из них прочитал 1 файл SDF и обработал их.Я уже пытаюсь сделать функцию, которая получает моль, но она не работает, когда я использую RQ
или Joblib
(используя функцию, как работает приведенный ниже код, но RQ
или Joblib
не отправит mol
?).В моем случае я просто хочу получить свойства InChI, SMILES и других для каждой молекулы, но в последовательном алгоритме требуется более 1 часа для 200 тысяч молекул (у цинка есть миллионы, поэтому невозможно использовать последовательный алгоритм).Пример:
def get_properties(self, mol):
return '|'.join([Chem.MolToInchi(mol), Chem.MolToSmiles(mol, isomericSmiles=True), ...])
suppl = Chem.SDMolSupplier('chembl_24_1.sdf')
string_with_results = ''
for mol in suppl:
if mol is not None:
string_with_results = ''.join([string_with_results, get_properties(mol), '\n'])