通常使用哪种内部或外部数据处理方式?
Which kind of of data handling, internal or external, is commonly used?
我正在 Python3.5 中编写一个程序来读取数据集并执行一些操作(如果您熟悉的话,它就是 DICOM 数据)。它使用:
- 大小为 (512,512,141) 或更大的大型数组。
- 大量小元数据(许多单个数据条目)。
现在我的程序有许多不同的组件,它们都将使用同一组数据。我的问题是处理这些数据的最佳做法是什么?我:
- 通过内部变量传递数据? 我觉得这是对 memory/space 的低效使用,因为每次我都必须向下传递数据(不破坏 where它来自)它是在不必要地添加资源?
- 使用文件存储系统? 当我说这个时,我指的是诸如 SQL、HDF5 甚至 python 中的值字典之类的东西.
- 每次需要时都读取数据? 例如,我必须导入库、加载文件、在文件中搜索变量、存储变量并再次关闭文件。看起来很乏味。
哪种方法最好?我不是一次或两次访问此数据,而是 20 多次。有没有我不知道应该使用的方法?
在此先感谢,我非常重视您的帮助(以及必要时的批评),以不断提高自己作为一名程序员和一个人的水平。
看来您实际上是在问多个问题。让我试着把它们分开:
我应该将所有数据存储在内存中吗?
可以吗?你有足够的内存来舒适地这样做吗?然后去做。加载一次并传递它,或者根据需要传递一些数据接口。你如何与它交互是你的选择(见下文)。否则你别无选择,只能多次调用磁盘I/O。但我认为从磁盘冗余读取相同数据通常是一个糟糕的决定,因为磁盘 I/O 往往是瓶颈资源。
我应该将大量数据传递给许多函数吗?这不会创建不必要的数据副本吗?
Python 函数参数被传递 "by assignment" 可以这么说。使用 C 术语,虽然在技术上并不精确,但它更像是按引用传递而不是按值传递。您通常看不到这种行为,因为 1) python 中的很多东西是不可变的,并且 2) python 中的赋值语句只是将名称重新分配给不同的值。您可以看到此行为的示例是可变对象,如 list
、dict
或任何具有可变成员属性的对象。尝试将列表传递给函数并在内部修改它。它也会在函数 returns.
之后的传递上下文中被修改
我应该如何处理我的数据?
这取决于我能想到的几件事。首先,您决定将数据存储在内存中还是磁盘上(参见第一个问题)?其次,您需要从哪里访问数据?第三,如果您将其存储在内存中,您是否需要在程序运行之间保留数据?
如果你可以将数据存储在内存中,只需要在本地访问它,而不需要它持久化,我会选择某种嵌套 python dict
,可能制作一个或多个自定义 class
es 以简化数据接口。
如果您可以将数据存储在内存中,但需要通过网络访问它或需要它在程序运行之间保持不变,我会使用 redis 或类似的键值存储来管理数据。 redis is really easy to learn and there's good python library support.
如果你不能将数据存储在内存中,但又不想一遍又一遍地解析它,你至少应该在将它写回磁盘之前对其进行索引。如果您只需要本地访问,您可能会使用文件系统想出自己的索引方案。如果这变得太复杂或者您需要网络访问,您可能应该使用数据库系统。
我正在 Python3.5 中编写一个程序来读取数据集并执行一些操作(如果您熟悉的话,它就是 DICOM 数据)。它使用:
- 大小为 (512,512,141) 或更大的大型数组。
- 大量小元数据(许多单个数据条目)。
现在我的程序有许多不同的组件,它们都将使用同一组数据。我的问题是处理这些数据的最佳做法是什么?我:
- 通过内部变量传递数据? 我觉得这是对 memory/space 的低效使用,因为每次我都必须向下传递数据(不破坏 where它来自)它是在不必要地添加资源?
- 使用文件存储系统? 当我说这个时,我指的是诸如 SQL、HDF5 甚至 python 中的值字典之类的东西.
- 每次需要时都读取数据? 例如,我必须导入库、加载文件、在文件中搜索变量、存储变量并再次关闭文件。看起来很乏味。
哪种方法最好?我不是一次或两次访问此数据,而是 20 多次。有没有我不知道应该使用的方法?
在此先感谢,我非常重视您的帮助(以及必要时的批评),以不断提高自己作为一名程序员和一个人的水平。
看来您实际上是在问多个问题。让我试着把它们分开:
我应该将所有数据存储在内存中吗?
可以吗?你有足够的内存来舒适地这样做吗?然后去做。加载一次并传递它,或者根据需要传递一些数据接口。你如何与它交互是你的选择(见下文)。否则你别无选择,只能多次调用磁盘I/O。但我认为从磁盘冗余读取相同数据通常是一个糟糕的决定,因为磁盘 I/O 往往是瓶颈资源。
我应该将大量数据传递给许多函数吗?这不会创建不必要的数据副本吗?
Python 函数参数被传递 "by assignment" 可以这么说。使用 C 术语,虽然在技术上并不精确,但它更像是按引用传递而不是按值传递。您通常看不到这种行为,因为 1) python 中的很多东西是不可变的,并且 2) python 中的赋值语句只是将名称重新分配给不同的值。您可以看到此行为的示例是可变对象,如 list
、dict
或任何具有可变成员属性的对象。尝试将列表传递给函数并在内部修改它。它也会在函数 returns.
我应该如何处理我的数据?
这取决于我能想到的几件事。首先,您决定将数据存储在内存中还是磁盘上(参见第一个问题)?其次,您需要从哪里访问数据?第三,如果您将其存储在内存中,您是否需要在程序运行之间保留数据?
如果你可以将数据存储在内存中,只需要在本地访问它,而不需要它持久化,我会选择某种嵌套 python dict
,可能制作一个或多个自定义 class
es 以简化数据接口。
如果您可以将数据存储在内存中,但需要通过网络访问它或需要它在程序运行之间保持不变,我会使用 redis 或类似的键值存储来管理数据。 redis is really easy to learn and there's good python library support.
如果你不能将数据存储在内存中,但又不想一遍又一遍地解析它,你至少应该在将它写回磁盘之前对其进行索引。如果您只需要本地访问,您可能会使用文件系统想出自己的索引方案。如果这变得太复杂或者您需要网络访问,您可能应该使用数据库系统。