通常使用哪种内部或外部数据处理方式?

Which kind of of data handling, internal or external, is commonly used?

我正在 Python3.5 中编写一个程序来读取数据集并执行一些操作(如果您熟悉的话,它就是 DICOM 数据)。它使用:

现在我的程序有许多不同的组件,它们都将使用同一组数据。我的问题是处理这些数据的最佳做法是什么?我:

哪种方法最好?我不是一次或两次访问此数据,而是 20 多次。有没有我不知道应该使用的方法?

在此先感谢,我非常重视您的帮助(以及必要时的批评),以不断提高自己作为一名程序员和一个人的水平。

看来您实际上是在问多个问题。让我试着把它们分开:

我应该将所有数据存储在内存中吗?

可以吗?你有足够的内存来舒适地这样做吗?然后去做。加载一次并传递它,或者根据需要传递一些数据接口。你如何与它交互是你的选择(见下文)。否则你别无选择,只能多次调用磁盘I/O。但我认为从磁盘冗余读取相同数据通常是一个糟糕的决定,因为磁盘 I/O 往往是瓶颈资源。

我应该将大量数据传递给许多函数吗?这不会创建不必要的数据副本吗?

Python 函数参数被传递 "by assignment" 可以这么说。使用 C 术语,虽然在技术上并不精确,但它更像是按引用传递而不是按值传递。您通常看不到这种行为,因为 1) python 中的很多东西是不可变的,并且 2) python 中的赋值语句只是将名称重新分配给不同的值。您可以看到此行为的示例是可变对象,如 listdict 或任何具有可变成员属性的对象。尝试将列表传递给函数并在内部修改它。它也会在函数 returns.

之后的传递上下文中被修改

我应该如何处理我的数据?

这取决于我能想到的几件事。首先,您决定将数据存储在内存中还是磁盘上(参见第一个问题)?其次,您需要从哪里访问数据?第三,如果您将其存储在内存中,您是否需要在程序运行之间保留数据?

如果你可以将数据存储在内存中,只需要在本地访问它,而不需要它持久化,我会选择某种嵌套 python dict,可能制作一个或多个自定义 classes 以简化数据接口。

如果您可以将数据存储在内存中,但需要通过网络访问它或需要它在程序运行之间保持不变,我会使用 redis 或类似的键值存储来管理数据。 redis is really easy to learn and there's good python library support.

如果你不能将数据存储在内存中,但又不想一遍又一遍地解析它,你至少应该在将它写回磁盘之前对其进行索引。如果您只需要本地访问,您可能会使用文件系统想出自己的索引方案。如果这变得太复杂或者您需要网络访问,您可能应该使用数据库系统。