【问题标题】:Julia - write to the beginning of fileJulia - 写入文件的开头
【发布时间】:2016-02-11 04:34:04
【问题描述】:

我一直在尝试开发一种算法,该算法有时需要将结果写入文件的开头或结尾。

我正在尝试创建一个排序算法,它不会使用太多 RAM,因为要排序的文件对于我当前的规格来说太大了。所以为了额外的时间成本,我想直接做这个文件而不是内存。

我知道可以用这种方式在 Julia 中编写文件>

write(outfile,"A, B, C, D\n")

但我似乎找不到如何写到它的开头。

感谢您的帮助。

【问题讨论】:

  • 您是想只overwrite 文件开头的数据还是insert 新数据而不丢失已经存在的数据?

标签: file-io julia writing


【解决方案1】:
s=open("test.txt", "a+");
write(s,"B");
write(s,"C");
position(s) # => 2
seekstart(s);
position(s) # => 0
write(s,"A"); # be careful you are overwriting B!
position(s) # => 1
close(s);
s=open("test.txt", "r");
read(s,Char) # => 'A'
read(s,Char) # => 'C' # we lost 'B'!

所以,如果你喜欢预先准备!文件流的东西,上面的解决方案不起作用。

cdata=readall(s);
seekstart(s);
write(s,prependdata);
write(s,cdata);

【讨论】:

  • 谢谢,这说明了一切。
【解决方案2】:

您可以使用两个文件而不是一个文件,就像您实现时一样 a deque with two stacks:

  • 要追加数据,追加到第一个文件:它将存储数据的尾部。

  • 要添加数据,追加到第二个文件:它将存储数据的头部,但顺序相反。

  • 当您需要单个文件中的数据时(可能只需要一次,在算法结束时),反转第二个文件中的行并连接文件。

【讨论】:

    【解决方案3】:

    无法将数据添加到磁盘文件中。

    写入文件流时没有“插入模式”。

    如果您的文件对于您当前的规格来说太大,我建议改用数据库。

    如果数据集的大小不是问题,您可以随时将现有文件的内容读入内存,将新数据添加到其中,然后覆盖整个文件。但它实际上并没有节省 RAM,因为每次仍然需要将整个数据集读入内存。

    【讨论】:

    • 是否有特定原因说明为什么它不可能?如果很明显,请原谅,我不是这方面的专家。
    • @sdgawerzswer 底层不直接支持。 (在许多文件系统中,文件存储在块中。如果您决定在文件开头插入一些数据,则需要将文件其余部分中的数据移动到其他位置,这可能是磁盘 I/O 的低效操作比内存慢得多)
    • @sdgawerzswer 当然,您始终可以将现有文件读入内存,操作内存中的数据并重写整个文件。但它实际上并没有“节省内存”。恕我直言,使用数据库是一个更好的选择。
    • 但是数据库仍然需要很多空间不是吗?如果算法仍然迭代运行(在运行时无法读取整个数据库),我创建一个额外的数据库会有什么不同。
    • @sdgawerzswer 是的,数据库需要大量磁盘空间,因为无论如何都需要存储数据。简单地说,它只是一个更好管理(也更复杂)的文件系统。假设您有足够的磁盘空间和有限的 RAM,使用数据库可能会有所帮助。但我并不是说这绝对是正确的方法——这完全取决于您的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2013-01-20
    相关资源
    最近更新 更多