保留输入到输出的顺序,而每个输出都来自应该读取一次的文件

问题描述 投票:0回答:1

我正在努力想出关于特定功能的最佳方式来构建我的程序。

以下是一些细节:

  • 函数的输入是(纬度,经度)坐标向量
    • 这些可以按照 用户提供的顺序
  • 函数的输出应该是输入坐标处的高程,其顺序与输入相同
  • 通过访问 TIFF 文件中的像素值来检索高程,这些像素值以整数纬度、经度坐标命名,例如
    n40w106
    n40w107
    、...
    • 这个数字代表左上角,例如:
      • (39.5, -105.5), (39.8, -105.2) 都在
        n40w106.tif
      • (40.3, -106.1), (40.5, -106.9) 都在
        n41w107.tif
    • 这意味着可能需要从同一文件中检索输入向量中不同点的多个点
  • 我已经拥有获取输入点并从相应文件中检索高程的所有功能

我正在努力解决的是我想确保的这些额外要求:

  • 每个文件只能加载一次
  • 仅在当前正在使用文件的数据时将其存储在内存中(所以我认为缓存不起作用)
  • 输出的顺序应与提供的输入的顺序相对应

CS中是否有一些现有的范式或概念可以实现我想要的?

我也对是否有一个可以很好地处理并发的模型感兴趣。 作为参考,我使用 Rust 编程语言。

rust caching design-patterns concurrency computer-science
1个回答
0
投票

总而言之,每个文件只能加载一次并且它们在使用时只能保存在内存中的要求意味着您必须提前确定一组都来自同一文件的组。否则你无法同时满足这两个约束。

为了保持顺序,您可以提前创建输出缓冲区。然后,当将输入列表组织为组时,您可以将其索引包含在输入列表中,以便处理该项目的代码可以将其直接写入输出缓冲区中的正确槽中。

最后,将每个组发送到一个线程,在该线程中可以一次性处理单个文件的所有条目。

请注意,由于 Rust 的别名规则,如果没有某种互斥体保护,线程通常无法同时写入缓冲区。但是,您可以通过在输出缓冲区中使用

split_at_mut
来解决此问题,在每个项目上存储单元素可变切片而不是索引。那么就没有别名,并且不需要互斥体。

您还需要使用作用域线程,以便可以将这些可变切片发送到线程。

最后,如果所有线程都成功完成,则返回输出缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.