1

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

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

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

  • 通过内部变量传递数据?我觉得这是对内存/空间的低效使用,因为每次我必须将数据向下传递(而不破坏它的来源)它是在不必要地添加资源?
  • 使用文件存储系统?当我这么说时,我指的是诸如 SQL、HDF5 甚至是 python 中的值字典之类的东西。
  • 每次需要时读取数据?因此,例如我必须导入库、加载文件、在文件中搜索 var、存储 var 并再次关闭文件。似乎相当乏味。

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

在此先感谢您,我重视您的帮助(以及必要时的批评),以始终提高自己作为程序员和人类的水平。

4

1 回答 1

1

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

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

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

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

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

我应该如何与我的数据交互?

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

如果您可以将数据存储在内存中,只需要在本地访问它,并且不需要它持久化,我会使用某种嵌套的 python dict,也许制作一个或多个自定义classes 来简化数据接口.

如果您可以将数据存储在内存中,但要么需要通过网络访问它,要么需要它在程序运行之间持续存在,我会使用redis或类似的键值存储来管理数据。redis 真的很容易学习,并且有很好的 python 库支持

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

于 2016-09-17T01:35:12.813 回答