【问题标题】:Read entire file bytes at once using intersystems' Cache?使用系统间的缓存一次读取整个文件字节?
【发布时间】:2017-06-16 07:12:12
【问题描述】:

我在size {filebyte} 中有一个字节为 1.5GB 的文件。我想在一个类似于 Delphi 的实例中读取整个文件

bytedata:=filebyte.readallbytes(filename);

结果是,在一个实例中,您将拥有一个元素数量为高(字节数据)-低(字节数据)+1 的字节数组。缓存中是否有等效代码。一个1.5G大小的文件能否保存在内存中的缓存中。 我不想分块读取文件,因为分析数据的操作要求整个文件一次都在内存中。 谢谢

【问题讨论】:

    标签: file caching byte intersystems


    【解决方案1】:

    您可以根据需要从流中读取任意数量的数据。问题就在这里,你可以在局部变量中存储多少。

    set fs=##class(%Stream.FileCharacter).%New()
    set fs.Filename="c:\test.txt"
    set length=fs.Size
    set data=fs.Read(length) \\ if size no more than 3.5Mb
    

    局部变量大小limited 由 3,641,144 字节或 32,767 字节的长字符串禁用。每个进程最多 2012.1 内存被限制为 48 兆字节。并且在 2012.2 中进行了更改,可以设置为 2 terabytes per process,并且可以通过编程方式实时设置为具有特殊变量 $zstorage 的当前进程。

    【讨论】:

    • 在您的示例中,变量数据是否包含整个文件?如果是这样,如何访问子元素?
    • 是的,它会包含整个内容,但是子元素是什么意思?
    • 如果文件由(1-4)之间的1000个字节的值组成,排他将data(1)=2,data(2)=4....data(999)=1,data (1000)=4 或将 data=2421123.....14 其中 14 是第 999 和第 1000 个字节。如果是后者,那么单个字节就不能轻易地被操纵,并且与一次读取一个值相比,读取整个文件没有任何优势。在我的delphi示例中 bytedata:=filebyte.readallbytes(filename) bytedata 是一个数组,其值从 0 到 length-1 和 bytedata[0]=2,bytedata[2]=4, bytedata[998]=1 和 bytedata[ 999]=4。缓存中有没有类似的操作?
    • 数据,它只是一个字符串,你可以得到任何符号或下标,用$extract函数,详细看文档-docs.intersystems.com/latest/csp/docbook/…
    • 长度为 1.5GB 的字符串将超过最大字符串长度,因此 $extract 不合适。
    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2014-12-12
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多