【问题标题】:Which kind of of data handling, internal or external, is commonly used?通常使用哪种类型的数据处理(内部或外部)?
【发布时间】:2016-09-16 23:14:34
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python external internals datahandler


    【解决方案1】:

    似乎您实际上在这里提出了多个问题。让我试着把它们分开:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 完美!感谢您花时间解释@machine。有帮助的两个关键陈述是(1)你有足够的记忆力吗?那就去做吧……因为磁盘 I/O 往往是瓶颈资源。和 (2) 尝试将列表传递给函数并在内部对其进行修改。函数返回后,它也会在传递的上下文中被修改。这两个我都没有考虑过或不知道。
    • 公平地说,除非您经常进行文件操作和/或写入,否则您可能不会注意到磁盘 I/O 瓶颈。但本着不要多次无意义地做同一件事的精神,您不妨只读取一次数据并对其进行索引以便以后访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多