2015-05-19 67 views
1

我试着让应用程序读取文件。文件可能大于2GB,因此我无法将它们完全加载到内存中。由于这种我正在文件读取系统上的WinRT允许我:与局部缓冲器如何使用IRandomAccessStream和DataReader?

  1. 读取文件 - 负载到存储器件的尺寸5MB 例如,那么如果字节的所需量在 存在用户检查缓冲。
  2. 给我多线程访问文件 - 例如我需要读取2个断开连接目的的文件。
  3. 生成的系统必须使用尽可能少的cpu,内存和硬盘时间。

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

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

@Yakk FYI,WinRT暗示它是C++/CX,而不是C++/CLI –

+1

@LucasTrzesniewski啊,又一种方言?对不起,misedit。 – Yakk

+0

@Yakk不用担心,是的,他们又提出了另一种方言(不在CLI上运行,没有GC,因此'gcnew'关键字不适合,等等),但它几乎是相同的语法:-) –

回答

0

伟大的问题,你在正确的轨道上。

  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

好运。