Какой тип обработки данных, внутренний или внешний, обычно используется?

Я пишу программу на Python3.5, которая читает набор данных и делает некоторые вещи (это данные DICOM, если вы знакомы с ними). Оно использует:

  • Большие массивы размером (512 512 141) или больше.
  • Много небольших метаданных (много отдельных записей данных).

Теперь в моей программе много разных компонентов, которые будут использовать один и тот же набор данных. Мой вопрос: какова лучшая практика обработки этих данных? Должен ли я:

  • Передать данные через внутренние переменные? Я чувствую, что это неэффективное использование памяти / пространства, так как каждый раз, когда мне приходится передавать данные по линии (не разрушая, откуда они взялись), что они излишне добавляют ресурсы?
  • Использовать систему хранения файлов? Когда я говорю это, я имею в виду что-то вроде SQL, HDF5 или даже словарь значений внутри python.
  • Читать данные каждый раз, когда мне это нужно? Так, например, мне нужно будет импортировать библиотеку, загрузить файл, найти файл для var, сохранить var и снова закрыть файл. Кажется довольно утомительным.

Какой метод самый лучший? Я не получаю доступ к этим данным один или два раза, но порядка 20+ раз. Есть ли метод, о котором я не знаю, который мне следует использовать?

Заранее спасибо, я ценю вашу помощь (и критику, где это необходимо), чтобы всегда улучшать себя как программиста и человека.

1 ответ

Решение

Похоже, вы на самом деле задаете несколько вопросов здесь. Позвольте мне попытаться дразнить их друг от друга:

Должен ли я хранить все свои данные в памяти?

Ты можешь? Достаточно ли у вас памяти, чтобы сделать это комфортно? Затем сделать его. Загрузите его один раз и передайте, или, если необходимо, передайте некоторый интерфейс к данным. Как вы взаимодействуете с ним - ваш выбор (см. Ниже). В противном случае у вас нет выбора, кроме как сделать несколько вызовов дискового ввода-вывода. Но я думаю, что в общем случае плохое решение считывать одни и те же данные с диска избыточно, поскольку дисковый ввод-вывод обычно является узким местом.

Должен ли я передать множество данных для множества функций? Не создаст ли это ненужные копии данных?

Аргументы функции Python передаются, так сказать, "по присваиванию". Если использовать терминологию С, хотя это и не является технически точным, это больше похоже на передачу по ссылке, чем передачу по значению. Вы обычно не видите такого поведения, потому что 1) многие вещи в Python являются неизменяемыми, и 2) операторы присваивания в Python просто переназначают имя на другое значение. Примеры, где вы можете увидеть это поведение, являются изменяемыми объектами, такими как list, dict или любой вид объекта со свойствами изменяемого члена. Попробуйте передать список функции и изменить его внутри. Он также будет изменен в передаваемом контексте после возврата из функции.

Как я должен взаимодействовать с моими данными?

Это зависит от нескольких вещей, о которых я могу думать. Во-первых, вы решили сохранить данные в памяти или на диске (см. Первый вопрос)? Во-вторых, откуда вам нужен доступ к данным? В-третьих, если вы храните его в памяти, нужны ли вам данные для сохранения между запусками программы?

Если вы можете хранить данные в памяти, просто хотите получить к ним локальный доступ, и вам не нужно, чтобы они сохранялись, я бы просто использовал какой-то вложенный питон dict, возможно сделать один или несколько пользовательских classЭто упрощает интерфейс к данным.

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

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

Другие вопросы по тегам