我正在寻找一种将一些数据(List
,Array
,等等)写入二进制文件的方法。要放入二进制文件的集合表示一个点列表。到目前为止我所尝试的:
[
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
}
允许按范围选择性访问的点坐标跨平台共享格式
您的要求是:
要使用的数据结构
每个元素的数据结构和大小必须一致,以允许通过范围计算某些部分的位置。你知道吗
用于存储列表/数组的Scala格式是否满足此要求,以及 二进制格式定义得很好,您可能会成功。如果没有,你必须找到 另一种格式。你知道吗
用Python读取二进制数据
假设格式是已知的,使用stdlib中的Python
struct
模块来读取它。你知道吗另一种方法:将数据分割成更小的片段
您愿意逐段访问数据,可能希望S3上有一个大对象,并使用范围为的HTTP请求。你知道吗
另一种解决方案是将数据分割成更小的片段,这些片段的大小对于获取来说是合理的(例如64kb,但是您更了解自己的用例),并设计规则将它们逐段存储在awss3上。您甚至可以使用树结构来实现这个目的。你知道吗
这种方法有一些优点:
请注意,awss3不仅会对数据传输收费,而且还会对每个请求收费,因此每个使用RANGE的HTTP请求都将计为一个。你知道吗
要考虑的跨平台二进制格式
考虑以下格式:
如果您访问Wikipedia页面中的任何一种格式,您将发现许多指向其他格式的链接。你知道吗
无论如何,我不知道任何这样的格式,这将是每个元素使用统一的大小,因为他们中的大多数都试图保持尽可能小的大小。因此,除非引入一些特殊的索引文件(可能不太可行),否则它们不能在场景使用范围中使用。你知道吗
另一方面,使用这些格式的替代方法(拆分 数据到较小的部分)应工作。你知道吗
注意:我以前做过一些关于存储效率和编码/解码速度的测试。从实际的角度来看,最好的结果是使用简单的JSON结构(可能是压缩的)。您可以在每个平台上找到这些选项,使用非常简单,编码/解码速度很高(我不说最高)。你知道吗
相关问题 更多 >
编程相关推荐