Предварительно мне кажется, что может иметь больше смысла, вместо того, чтобы хранить ваш диктант как { id : seq }
, хранить его как { seq : [id_list] }
. Поскольку кажется, что в каждой последовательности много повторов, это сэкономит время при доступе ко всем идентификаторам определенной последовательности. Вы можете сделать это при чтении ваших данных, используя defaultdict
со значением по умолчанию в качестве пустого списка, а когда вы читаете идентификатор и последовательность, вы можете добавить его к dict с помощью sequences_dict[record.seq].append(record.description)
.
Дайте мне знать, если это поможет, и могу ли я помочь с чем-либо еще.
Как Erik сказал, Маршал действительно имеет в виду копию, но я не думаю, что он ответил на основной момент Вашего вопроса.
Необходимо ли держать на pData собственный указатель, пока MyDataStructure не является GCed? Нет.
После того, как упорядоченный, Ваш экземпляр MyDataStructure, нечто, содержит копию структуры, на которую указывает pData. Вы не должны держать на pData больше. Для предотвращения утечки памяти необходимо передать это pData в другую неуправляемую функцию, которая удалит его, и это может быть сделано правильно после маршалинга, независимо от того, сколько времени Вы держитесь за экземпляр MyDataStructure.
Да, в этом случае Маршалл означает копию; таким образом необходимо освободить память в неуправляемом коде. Весь вызов к PtrToStructure делает читается многие байты, обозначенные размером целевой структуры 'MyDataStructure' от ячейки памяти, на которую указывает pData.
Детали, конечно, зависят от точно, на что 'MyDataStructure' похож (сделайте Вы используете любые атрибуты FieldOffset или StructLayout в MyDataStructure) - но конечный результат состоит в том, что возврат из PtrToStructure является копией данных.
Как GBegen указывает в его ответе, я не ответил на основной момент Вашего вопроса. Да, необходимо будет удалить неуправляемую копию структуры в неуправляемом коде, но не, Вы не должны держать на pData - можно удалить неуправляемую копию, как только вызов к PtrToStructure завершается.
PS: я отредактировал свое сообщение для содержания этой информации, чтобы консолидировать ответы в одно сообщение - если любой upvotes этот ответ, upvote ответ GBEGEN также для его вклада.