如何用C / C ++读取/恢复大数据文件(SEGY格式)?

时间:2014-09-24 03:10:44

标签: c++ c bigdata store

我正在研究一个需要处理SEGY格式的大型地震数据的项目(从几GB到TB)。该数据代表3D地下结构。

数据结构如下:

1st tract, 2,3,5,3,5,....,6
2nd tract, 5,6,5,3,2,....,3
3rd tract, 7,4,5,3,1,....,8
...

我想问的是,为了快速阅读和处理数据,我是否必须将数据转换为另一种形式?或者从原始SEGY文件中读取更好?是否有任何现有的 C 包来做到这一点?

4 个答案:

答案 0 :(得分:4)

  • 如果您需要访问多次次和
  • 如果您需要随机
  • 如果您需要访问快速

然后将其加载到数据库一次

不要重新发明轮子。

答案 1 :(得分:2)

在处理该大小的数据时,您可能不希望将其转换为另一种形式,除非您必须 - 尽管某些软件确实do just that。我发现list of free geophysics software on Wikipedia看起来很有希望;许多是开源和读/写SEGY文件。

由于您是编程的新手,您可能需要考虑Python库segpy是否适合您的需求而不是C / C ++选项。

答案 2 :(得分:0)

如果我们要关于叠后,那么几GB就是中等。 您可以使用segy并即时转换,您可以创建自己的格式。这取决于你需要做什么。在不改变segy格式的情况下,它足以为跟踪创建索引。如果将segy保存为内联 - 虽然跨线访问并不是很糟糕,但它可以更快地通过内联访问。 如果它是3d地震,那么对所有内联/交叉线进行相同快速访问的最佳方法是拥有自己的基于格式的od bean,例如8x8跟踪 - 加载所有bean并选择tarces访问时间可能非常快 - 2-3 secends。或者您可以使用SSD磁盘或2.5x RAM作为您的SEGY。 要快速访问timeslices,您有两种方式 - 3D bean或第二个文件存储为timeslices(快速方式)。我在10年前做过同样的事情 - 12 GB SEGY的访问时间是可以接受的 - 在所有3个方向上都是2-3秒。 SEGY在数据库中?哇......;)

答案 3 :(得分:0)

答案取决于您需要从SEG-Y文件中提取的数据类型。

如果您只需要提取标题(文本标题,二进制标题,扩展文本文件标题和跟踪标题),则可以通过将文件打开为二进制文件并从中提取相关信息,从SEG-Y文件中轻松提取它们。数据交换格式(rev2)中提到的各个位置。提取可能取决于数据类型(Post-stack或Pre-stack)。此外,某些标头可能需要从一种格式到另一种格式的转换(例如,文本标题主要以EBCDIC格式编码)。有关字节位置和编码格式的完整详细信息,请参阅上述文档

跟踪数据的提取有点棘手,取决于各种因素,如编码,是否为。跟踪标题中提到了跟踪样本等。仔细阅读文档并了解您正在处理的SEG数据的类型肯定会使这项任务变得更加容易。

由于您正在使用提取的数据,我建议使用现有的库(segpy:我遇到的最好的python库之一)。还有许多免费提供的SEG-Y读者,Daniel Waechter已经提到了一个非常好的清单;您可以选择任何一个适合您的要求和支持的类型文件格式。

我最近尝试使用C ++做同样的事情(虽然它只在叠后数据上测试过)。该项目可以找到here