【问题标题】:How to work with IRandomAccessStream and DataReader?如何使用 IRandomAccessStream 和 DataReader?
【发布时间】:2016-08-11 11:23:56
【问题描述】:

我正在尝试制作读取文件的应用程序。文件可能大于 2GB,因此我无法将它们完全加载到内存中。因此,我正在为 WinRT 开发文件读取系统,这允许我:

  1. 使用部分缓冲区读取文件 - 加载到大小为 5mb 的内存块 例如,然后用户检查是否存在所需的字节数 缓冲区。
  2. 授予我对文件的多线程访问权限 - 例如,我需要为 2 个断开连接的目的读取文件。
  3. 生成的系统必须使用尽可能少的 CPU、内存和硬盘时间。

现在我设计了一个在 1 个线程中读取带有缓冲区的文件的东西,我有一些问题:

  1. DataReader->LoadAsync(N)DataReader->ReadBytes(target_array) 之间会发生什么?第一个操作是否将数据加载到内存中,第二个操作是否将数据放入目标?
  2. DataReader(或IRandomAccessStream,我不知道到底是哪一个)将加载的数据存储在交换文件中(用ssd驱动器捕获它:交换放在硬盘上,第二次尝试读取相同的数据显示速度与硬盘一样)。如何避免?
  3. 我设计的阅读系统(file->buffer->user)适合DataReaderIRandomAccessStream吗?

【问题讨论】:

  • @Yakk 仅供参考,WinRT 暗示它是 C++/CX,而不是 C++/CLI
  • @LucasTrzesniewski 啊,另一种方言?很抱歉编辑错误。
  • @Yakk 不用担心,是的,他们制作了另一种方言(不在 CLI 上运行,没有 GC,因此 gcnew 关键字不合适,等等),但是它几乎语法相同:-)

标签: windows-runtime c++-cx


【解决方案1】:

很好的问题,你在正确的轨道上。

  1. 是的,DataReader->LoadAsync(uint count) 似乎从源(磁盘、网络、内存)复制数据并将其加载到读取器的中间缓冲区。确保等待返回的DataReaderLoadOperation 完成,然后再开始读取DataReader,否则会遇到一些难以调试的异常。

  2. DataReader 只是为IRandomAcessStream/IInputStreamReadAsync 方法提供了一个包装器。文件是否交换由IRandomAcessStream的实现决定。 Windows 似乎默认缓存文件。 You can read more about Window's file caching mechanism here. 我查看了 StorageFile 并找不到禁用缓存的方法,但有一种方法可以通过 Win32 API 来实现,CreateFile

  3. 这个设计不错;只要您打算按顺序读取文件,它就工作得最好,而不是寻找。当寻找附加到DataReader 的流时,DataReader 继续在其当前内部位置读取。仅在再次调用 LoadAsync 时才会更新。为了在多线程中使用,您可以调用IRandomAccessStream.GetInputStreamAt在指定位置创建输入流的副本并将DataReader绑定到该位置。

祝你好运,使用这个文档齐全的 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多