我正在C#中build立一个玩具数据库,以了解关于编译器,优化器和索引技术的更多信息。
我希望保持(至less读取)将页面带入缓冲池的请求之间的最大并行度,但是我对如何最好地在.NET中完成这个问题感到困惑。
以下是一些选项和我遇到的问题:
使用System.IO.FileStream和BeginRead方法
为什么在Windows7(.net 3.5)中运行的应用程序在Win8(.net4.5)中不起作用
如何将引发的exception映射到事件ID以进行日志logging?
以编程方式启用Windowsfunction的最佳方法是什么?
通过远程桌面提高WPF应用程序的速度?
Visual Basic:重新启动桌面Windowspipe理器(DWM)
但是,文件中的位置不是BeginRead的参数,它是FileStream的属性(通过Seek方法设置),所以我一次只能发出一个请求,并且必须lockingstream的持续时间。 (或者我?文档不清楚如果我只在Seek和BeginRead调用之间locking锁,但在调用EndRead之前释放它,会发生什么情况。有谁知道?)我知道如何做,我只是不确定这是最好的方法。
似乎还有另外一种方法,以System.Threading.Overlapped结构为中心,并在kernel32.dll中对 ReadFileEx函数进行P Invoke。
不幸的是,样本数量很less,特别是在托pipe语言中。 这条路线(如果可以的话)显然也涉及ThreadPool.BindHandle方法和线程池中的IO完成线程。 我觉得这是在Windows下处理这种情况的认可方式,但是我不明白这一点,我找不到有助于外行的文档的切入点。
别的东西?
在评论中,jacobbuild议为每个在飞行中的阅读创build一个新的FileStream 。
将整个文件读入内存。
如果数据库很小,这将工作。 代码库很小,还有很多其他的低效率,但是数据库本身不是。 我也想确定我正在做所有需要处理大型数据库的簿记(事实certificate,这是复杂性的一个重要部分:分页,外部sorting,…),我担心它可能也是容易不小心作弊。
编辑
澄清为什么我对解决scheme的怀疑1:从BeginRead到EndRead的所有方式持有一个锁意味着我需要阻止任何人想要启动一个阅读,因为正在进行另一个阅读。 这感觉不对,因为启动新读取的线程可能(通常)在结果可用之前做更多的工作。 (实际上,写这个让我想出了一个新的解决scheme,我把它作为一个新的答案。)
为什么“ n”在Windows上换行?
文件的安全stream更新
如何获取.NET 2.0中的Environment.SpecialFolders.MyVideo文件夹?
c#TrimEnd删除更多需要?
在windows phone 8.1 C#中显示&#8211带笑脸的文字(笑脸看起来像&#8211。)
我们所做的只是在C ++ / CLI中的I / O完成端口,ReadFile和GetQueuedCompletion状态周围写一个小的层,然后在操作完成后再调用C#。 我们选择了BeginRead和c#异步操作模式的这条路线,以提供对用于从文件(或套接字)读取的缓冲区的更多控制。 与每次读取时在堆上分配新的byte []相比,这是一个相当大的性能提升。
另外,还有更多完整的C ++使用IO完成端口在互联网上的例子
我不知道为什么选项1不适合你。 请记住,你不能有两个不同的线程试图同时使用相同的FileStream – 这样做肯定会导致你的问题。 BeginRead / EndRead是为了让您的代码在执行潜在的昂贵的IO操作时继续执行,而不是启用对某个文件的某种多线程访问。
所以我建议你寻求,然后做一个初步的读。
如果你先将资源(文件数据或其他)加载到内存中,然后通过线程共享它,该怎么办? 由于它是一个小的分贝。 – 你不会有太多的问题要处理。
使用方法#1, 但是
当有请求进入时,请锁A.使用它来保护等待读取请求的队列。 将它添加到队列并返回一些新的异步结果。 如果这导致第一次加入队列,请在返回之前调用第2步。 在返回之前释放锁定A.
当读操作完成(或者被第1步调用)时,取锁A.用它来保护从队列中弹出读请求。 取锁B.用它来保护Seek – > BeginRead – > EndRead序列。 释放锁定B.更新步骤1为此读取操作创建的异步结果。 (由于读取操作完成,请再次调用。)
这解决了不阻塞任何开始读取的线程的问题,因为正在进行另一个读取,但是仍然会读取序列,使得文件流的当前位置不会混乱。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。