将集合写入二进制fi

2024-10-02 00:38:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种将一些数据(ListArray,等等)写入二进制文件的方法。要放入二进制文件的集合表示一个点列表。到目前为止我所尝试的: [

11:17]
Welcome to Scala 2.12.0-M3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40).
Type in expressions for evaluation. Or try :help.

scala> import java.io.{FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream}
import java.io.{FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream}

scala> val oos = new ObjectOutputStream(new FileOutputStream("/tmp/f1.data"))
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@13bc8645

scala> oos.writeObject(List(1,2,3,4))

scala> oos.close

scala> val ois = new ObjectInputStream(new FileInputStream("/tmp/f1.data"))
ois: java.io.ObjectInputStream = java.io.ObjectInputStream@392a04e7

scala> val s : List[Int] = ois.readObject().asInstanceOf[List[Int]]
s: List[Int] = List(1, 2, 3, 4)

好的,很好用。问题是,也许明天我需要用另一种语言Python来读取这个二进制文件。它是一种更通用的二进制文件,可以被多种语言读取的方法吗?你知道吗

解决方案

对于在相同情况下搜索的人,您可以这样做:

def write2binFile(filename : String, a : Array[Int]) = {
      val inChannel = new RandomAccessFile(filename, "rw").getChannel
      val bbufer = ByteBuffer.allocateDirect(a.length * 4)
      val ibuffer = bbufer.asIntBuffer()
      ibuffer.put(a)
      inChannel.write(bbufer)
      inChannel.close
    }

Tags: 文件ionew二进制valjavalistint
1条回答
网友
1楼 · 发布于 2024-10-02 00:38:15

允许按范围选择性访问的点坐标跨平台共享格式

您的要求是:

  • 用Scala存储数据,用Python(或其他语言)读取
  • 数据是点坐标的列表
  • 将数据存储在AWS S3上
  • 允许使用范围请求仅获取部分数据

要使用的数据结构

每个元素的数据结构和大小必须一致,以允许通过范围计算某些部分的位置。你知道吗

用于存储列表/数组的Scala格式是否满足此要求,以及 二进制格式定义得很好,您可能会成功。如果没有,你必须找到 另一种格式。你知道吗

用Python读取二进制数据

假设格式是已知的,使用stdlib中的Pythonstruct模块来读取它。你知道吗

另一种方法:将数据分割成更小的片段

您愿意逐段访问数据,可能希望S3上有一个大对象,并使用范围为的HTTP请求。你知道吗

另一种解决方案是将数据分割成更小的片段,这些片段的大小对于获取来说是合理的(例如64kb,但是您更了解自己的用例),并设计规则将它们逐段存储在awss3上。您甚至可以使用树结构来实现这个目的。你知道吗

这种方法有一些优点:

  • 使用任何你喜欢的格式,比如XML,JSON,不需要处理特殊的二进制格式
  • 件可以压缩,你会节省一些成本

请注意,awss3不仅会对数据传输收费,而且还会对每个请求收费,因此每个使用RANGE的HTTP请求都将计为一个。你知道吗

要考虑的跨平台二进制格式

考虑以下格式:

  • BSON公司
  • (Google)结果缓冲区
  • HDF5型

如果您访问Wikipedia页面中的任何一种格式,您将发现许多指向其他格式的链接。你知道吗

无论如何,我不知道任何这样的格式,这将是每个元素使用统一的大小,因为他们中的大多数都试图保持尽可能小的大小。因此,除非引入一些特殊的索引文件(可能不太可行),否则它们不能在场景使用范围中使用。你知道吗

另一方面,使用这些格式的替代方法(拆分 数据到较小的部分)应工作。你知道吗

注意:我以前做过一些关于存储效率和编码/解码速度的测试。从实际的角度来看,最好的结果是使用简单的JSON结构(可能是压缩的)。您可以在每个平台上找到这些选项,使用非常简单,编码/解码速度很高(我不说最高)。你知道吗

相关问题 更多 >

    热门问题