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

时间:2016-09-16 23:14:34

标签: python external dicom internal datahandler

我正在用Python3.5编写一个程序,它读取数据集并做一些事情(如果你熟悉它就是DICOM数据)。它使用:

  • 大型数组(512,512,141)或更大。
  • 很多小元数据(许多单个数据条目)。

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

  • 通过内部变量传递数据?我觉得这是对内存/空间的低效使用,因为每次我必须传输数据(不破坏它来自哪里)它是不必要地添加资源?
  • 使用文件存储系统?当我这样说时,我会引用SQL,HDF5甚至是python中的值字典。
  • 每次需要时都会读取数据吗?因此,例如我必须导入库,加载文件,搜索文件以获取var,存储var并再次关闭文件。看起来很乏味。

哪种方法最好?我不是一次或两次访问这些数据,而是大约20次。是否有一种我不知道应该使用的方法?

在此先感谢,我非常重视你的帮助(以及必要的批评),以便始终提高自己作为程序员和人类的能力。

1 个答案:

答案 0 :(得分:1)

好像你实际上在这里提出了多个问题。让我试着将它们分开:

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

你能吗?你有足够的记忆力来舒服吗?然后去做。加载一次并传递它,或者根据需要将一些接口传递给数据。您如何与它进行交互是您的选择(见下文)。否则,您别无选择,只能多次调用磁盘I / O.但我认为从磁盘冗余读取相同数据通常是一个错误的决定,因为磁盘I / O往往是瓶颈资源。

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

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

我应该如何与我的数据接口?

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

如果你可以将数据存储在内存中,只需要在本地访问它,并且不需要它继续存在,我会选择某种嵌套的python dict,也许只需要一个或者更多自定义class es以简化数据接口。

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

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