【发布时间】:2012-06-27 08:18:42
【问题描述】:
我正在尝试将我的空间数据从表写入文件。但在写入磁盘之前,我需要知道磁盘上数据的确切大小。例如,假设我正在使用以下代码写入磁盘:
FileOutputStream fos = new FileOutputStream("t.tmp",false);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(gid);
oos.writeUTF(fullname);
oos.writeInt(d.shape.length);
oos.write(d.shape);
oos.close();
fos.close();
我在想磁盘上的文件大小等于:
size= 4B {for gid, int} + fullname.getBytes.length() {string} + 4B {d.shape.length, int} + d.shape.length
但实际上,这与磁盘上的实际文件大小有很大不同。
我还注意到,即使使用 ObjectOutputstream 创建一个空文件也会导致磁盘上有 4B 空间。
对如何计算磁盘上的文件大小有任何帮助吗?
(我无法将数据写入磁盘然后读取实际大小。这会降低性能。相反,我需要根据存储在内存中的数据值来计算磁盘上的数据大小。)
【问题讨论】:
-
你真的需要一个ObjectOutputStream吗?你用
writeObject()吗?还是您的示例代码和您得到的一样复杂?看来您最好使用DataOutputStream。 (ObjectOutputStream写入流标头信息并跟踪对已写入对象的引用,因此它可以简单地写入引用等 - 所有这些都会阻碍您预先计算大小的努力。) -
另外 - 您能否详细说明您在写入字节后使用文件系统所感受到的性能问题?
-
就性能问题而言。我的表中有 40GB 的数据,其中许多是空间数据。我以存储在每个文件中的数据的总大小小于某个值 (max_file_size) 的方式对表进行分区。在第一轮中,我计算了我的表格每一行在磁盘上的大小,在接下来的几轮中,我将它们中的许多相加,以使文件总大小小于 max_file_size。因此,写入每个文件然后测量磁盘上的实际文件大小不是一种选择。
-
就 ObjectOutputStream 的使用而言,我不确定这是否是写入磁盘的最佳方式。除了作为可变长度字节数组的几何之外,我还有几个字段可以键入 varchar(x)。我认为 ObjectOutputStream 将是读取/写入文件的最简单方法。事实上,到目前为止它运行良好。唯一的问题是我必须提前根据数据值计算磁盘上的大小。有什么建议吗?
-
ObjectOutputStream的用处在于它能够自动序列化复杂的对象图。但是,这似乎不是您正在做的事情,因此我建议您放弃ObjectOutputStream,而只需使用DataOutputStream自己编写字节。DataOutputStream不会自动执行任何操作,因此您将能够进行您期望的大小计算。注意DataOutputStream.writeUTF()的 Javadoc,因为它写入 2 个字节的长度数据,然后是字符串。
标签: java size fileoutputstream objectoutputstream