小编Mau*_*wer的帖子

使用HDF5写入两个不同的文件

我在C中有一个小型库,它使用HDF5在Windows下写入数据(v.1.8.14).那个lib然后由一个C#应用程序使用,该应用程序执行其他一些操作,然后需要编写大量数据.

我现在需要启动应用程序的两个实例,其想法是将每个实例保存到放置在两个不同硬盘上的两个不同文件.但是,我遇到了性能问题和数据丢失.通过检查磁盘的使用情况,似乎是串行写入数据(第一个HD忙,而第二个不忙,然后第二个变忙,第一个不忙等等),这就像有一个磁盘(和一个磁盘速度不够快,两倍于数据).

那么我该怎么做才能从两个不同的进程写入两个不同的文件呢?我需要使用Parallel HDF5吗?如果我以后想要在同一个进程中写入两个不同的文件,那么你要提出的解决方案也会有用吗?请提供相关资源的详细信息和链接

c# parallel-processing hdf5 storing-data

9
推荐指数
0
解决办法
169
查看次数

需要在C#中使用多线程,AVX,GPU等进行快速数据多路分解

我有一个非常简单的功能,可以解复用从电路板获取的数据.所以数据来自帧,每帧由多个信号组成,作为1-dim阵列,我需要转换为锯齿状阵列,每个信号一个.基本上如下: 多路分解

我在C#工作,但我在C中有一个核心功能,可以完成单个信号的工作:

void Functions::Demux(short*pMux, short* pDemux, int nSignals, int signalIndex, int nValuesPerSignal)
{
    short* pMuxStart = pMux + signalIndex;
    for (size_t i = 0; i < nValuesPerSignal; i++)
        *pDemux++ = *(pMuxStart + i * nSignals);
}
Run Code Online (Sandbox Code Playgroud)

然后我通过C#/ CLI(使用pin_ptr<short>,所以没有副本)从C#和并行调用它:

Parallel.For(0, nSignals, (int i) =>
{
    Core.Functions.Demux(muxed, demuxed[i], nSignals, i, nFramesPerSignal);
});
Run Code Online (Sandbox Code Playgroud)

多路复用数据来自16k信号(16位分辨率),每个信号具有20k样本/ s,其变为16k*20k*2 = 640MB/s的数据速率.当在具有2 Xeon E5-2620 v4的工作站上运行代码(总共16个核心@ 2.1GHz)时,解复用器需要大约115%(10个数据需要11.5秒).

我需要至少减少一半的时间.有没有人知道某种方式,也许是AVX技术,或者更好的一些高性能库?或者可能有使用GPU的方法?我宁愿不改进CPU硬件,因为这可能会花费更多.

编辑 请考虑nSignals并且nValuesPerSignal可以更改并且交错的数组必须在nSignals单独的数组中拆分,以便在C#中进一步处理.

编辑:进一步测试

与此同时,在Cody Gray的评论之后,我用单核测试了:

void _Functions::_Demux(short*pMux, short** pDemux, int nSignals, int nValuesPerSignal)
{
    for …
Run Code Online (Sandbox Code Playgroud)

c# algorithm performance multithreading avx

8
推荐指数
1
解决办法
449
查看次数

在循环内启动任务:如何传递可在循环内更改的值?

我试图在while循环中使用TPL,我需要将一些值传递给任务然后更改为循环.例如,这里显示了一个增加索引的示例(必须在请求创建任务的行之后):

int index = 0;
Task[] tasks;
while(/*condition*/)
{
    tasks[index] = Task.Factory.StartNew(() => DoJob(index));
    index++;
}
Run Code Online (Sandbox Code Playgroud)

但当然它不起作用,因为索引值可以在任务开始之前递增.一个可能的解决方案可能是在递增索引之前传递一个等待的WaitHandle,并且必须在DoJob方法中发出信号,但在我看来这不是一个非常好的解决方案.还有其他想法吗?

c# task task-parallel-library

7
推荐指数
1
解决办法
4455
查看次数

用于暂停线程的模式类似于CancellationTokenSource和CancellationToken模式?

我开始使用ConcellationTokenSource和CancellationToken在框架4.0中提供的协作线程取消模式,我发现它非常有用和简单.

我的目的是为我的应用程序提供类似的优雅和简单的解决方案,但暂停线程而不是取消它们.因为在这种情况下,请求将与监听pause命令不同,我认为像PauseTokenSource和PauseToken这样的东西会很好.所以我的第一个问题是,如果你建议合作暂停的这种模式,或者它是否更好的其他东西.

如果有这样的模式是个好主意,你对这个模式有什么建议或指导吗?目前我认为源应该能够通过ManualResetEvent暂停和取消暂停,并且令牌应该具有对源的引用.它遵循初稿,我希望你能给我一些改进建议.

public class PauseTokenSource
{
    protected ManualResetEvent mre = new ManualResetEvent(true);
    object syncRoot = new object();

    public PauseToken PauseToken { get { return new PauseToken(this); } }

    public bool IsPauseRequested { get { return !mre.WaitOne(0); } }

    public void Pause()
    {
        mre.Reset();
    }

    public void UnPause()
    {
        mre.Set();
    }

    public void WaitUntillPaused()
    {
        mre.WaitOne();
    }
}

public class PauseToken
{
    private PauseTokenSource source;

    public PauseToken(PauseTokenSource source)
    {
        this.source = source;
    }

    public bool IsPauseRequested 
    { 
        get { return …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns pausing-execution cancellation cancellationtokensource

6
推荐指数
1
解决办法
1050
查看次数

缺少Visual Studio 2012中Visual C++的先决条件

我最近安装了vs2012,我已经更新了我的ClickOnce应用程序.更确切地说,我第一次打开我的C++ project(依赖于我的主要c#项目)我没有更新它,一切正常.VS 2012仍然能够看到Visual C++ 2010的先决条件.后来我通过将Platform Toolset更改为"Visual Studio 2012 (v110)"under 来更新了我的项目Properties->Configuration Properties->General.

与此同时,我已经安装了其他版本software,现在我发现我无法为我的ClickOnce发布项目添加Visual C++先决条件.该Visual C++ 2010 Runtime Libraries (x64)前提标有黄色三角形,它是缺失的.理想情况下我想更新Visual C++ 2012 Runtime Libraries x64 (and x86),但即使这个先决条件也缺失了.

我想这是因为在文件夹C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper\Packages中相应的包(vcredist_x64)是空的.我也注意到,在控制面板中安装的程序列表中我已经Microsoft Visual C++ 2010 x64x86安装,同时可再发行版本和运行时版本(我认为他们在那里与Visual Studio 2010以前安装的),而我错过了在Visual C++ 2012文件.因此,我认为Visual C++ 2012没有与Visual Studio 2012结合在一起,不是吗?我甚至尝试通过下载来安装Visual C++ 2012 Redistributable x64软件包,现在它们已经在我安装的程序中列出,只有Redistributable,而不是Runtime版本.

但是先决条件仍然缺失.我怎么解决这个问题?我甚至想过手动复制引导程序包为Visual C++ 2010位于... \v7.0A\Bootstrapper\Packages文件夹,并手动更改它的C++ 2012,但我不知道我应该写在product.xml下面<MsiProductCheck …

clickonce prerequisites visual-studio-2012 visual-c++-2012

6
推荐指数
1
解决办法
6201
查看次数

使用退出代码0x1的Inno Setup失败了signtool

突然,我的Inno Setup编译器停止工作.自从我上次使用它以来,我刚刚安装了一份新的证书给同一家公司.

我已经以这种方式配置了签名工具(NAME是证书中Subject的字符串的开头):

mysigntool="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /v /a /s my /n NAME /t http://timestamp.verisign.com/scripts/timestamp.dll
Run Code Online (Sandbox Code Playgroud)

然后在Inno Setup .iss文件中我有:

SignTool=mysigntool
SignedUninstaller=yes
Run Code Online (Sandbox Code Playgroud)

如果我删除/ t和时间戳,则符号总是以退出代码0x1失败.请注意,如果我从命令提示符运行相同的命令,则签名工作正常.

signing inno-setup code-signing code-signing-certificate

6
推荐指数
2
解决办法
5976
查看次数

不通过C#访问C++/CLI重载操作符

我有以下C++/CLI类:

 public ref class MyClass
    {
    public:
        int val;
        bool operator==(MyClass^ other)
        {
            return this->val == other->val;
        }

        bool Equals(MyClass^ other)
        {
            return this == other;
        }
    };
Run Code Online (Sandbox Code Playgroud)

当我尝试从C#验证两个实例MyClass是否相等时,我得到了错误的结果:

MyClass a = new MyClass();
MyClass b = new MyClass();

//equal1 is false since the operator is not called
bool equal1 = a == b;
//equal2 is true since the comparison operator is called from within C++\CLI
bool equal2 = a.Equals(b);
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

c# c++-cli operator-overloading

4
推荐指数
1
解决办法
1602
查看次数

使用AppDomain进行卷影复制以在运行时覆盖exe

在下面的示例应用程序中,我创建了一个新的AppDomain,我执行它并启用了卷影复制.从新的AppDomain我然后尝试删除(替换)原来的主exe.但是我收到"访问被拒绝错误".有趣的是,在启动程序后,从Windows资源管理器中可以重命名主exe(但不能删除它).

阴影复制可以用于运行时覆盖主exe吗?

static void Main(string[] args)
{
    // enable comments if you wanna try to overwrite the original exe (with a 
    // copy of itself made in the default AppDomain) instead of deleting it

    if (AppDomain.CurrentDomain.IsDefaultAppDomain())
    {
        Console.WriteLine("I'm the default domain");
        System.Reflection.Assembly currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
        string startupPath = currentAssembly.Location;

        //if (!File.Exists(startupPath + ".copy"))
        //    File.Copy(startupPath, startupPath + ".copy");

        AppDomainSetup setup = new AppDomainSetup();
        setup.ApplicationName = Path.GetFileName(startupPath);
        setup.ShadowCopyFiles = "true";

        AppDomain domain = AppDomain.CreateDomain(setup.ApplicationName, AppDomain.CurrentDomain.Evidence, setup);
        domain.SetData("APPPATH", …
Run Code Online (Sandbox Code Playgroud)

c# shadow-copy appdomain

3
推荐指数
1
解决办法
4811
查看次数