小编Ale*_*ara的帖子

如何操纵*巨大*数据量

我有以下问题.我需要存储大量的信息(〜32 GB)的量和能够尽可能快地操纵它.我想知道最好的方法是什么(编程语言+操作系统的组合+你认为重要的东西).

我正在使用的信息的结构是双精度浮点数(8字节)的4D数组(NxNxNxN).现在我的解决方案是将4D阵列切成2D阵列并将它们存储在我的计算机硬盘中的单独文件中.这真的很慢,数据操作难以忍受,所以这根本不是解决方案!

我正在考虑进入我国的超级计算设施并将所有信息存储在RAM中,但我不确定如何实现应用程序以利用它(我不是专业的程序员,所以任何书籍/ reference将帮助我很多).

我正在考虑的替代解决方案是购买具有大量RAM的专用服务器,但我不确定这是否能解决问题.所以现在我的无知并没有让我选择最好的方式继续前进.

如果你遇到这种情况,你会怎么做?我对任何想法持开放态度.

提前致谢!


编辑:很抱歉没有提供足够的信息,我会尝试更具体.

我正在存储一个离散的4D数学函数.我想要执行的操作包括数组的转置(改变b [i,j,k,l] = a [j,i,k,l]等),数组乘法等.

由于这是对拟议实验的模拟,因此操作仅应用一次.一旦获得结果,就不必对数据执行更多操作.


编辑(2):

我也希望将来能够存储更多信息,因此解决方案应该以某种方式可扩展.当前的32 GB目标是因为我想让N = 256点的数组,但如果我可以使用N = 512(这意味着512 GB来存储它)会更好.

memory arrays memory-management hpc

11
推荐指数
1
解决办法
1880
查看次数

我可以使用GPL许可我的Matlab代码吗?

基本上就是这样.我在Matlab中有一些代码,我想发布它,所以任何人都可以使用它.另外我想防止代码在我之后关闭.

:我可以选择GPL进行许可吗?如果没有,我的选择是什么?(除了停止使用Matlab,我已经在考虑)


编辑

我只是编辑它,因为这对我的情况更准确.很抱歉给您带来不便.

:建议使用GPL发布我的Matlab代码以使其在社区中发展吗?如果没有,你会选择什么?

matlab licensing gpl

11
推荐指数
0
解决办法
4218
查看次数

在C/C++中快速读取多个文件的某些字节

我一直在网上搜索这个问题,尽管在C/C++中有许多关于读/写的类似问题,但我还没有找到关于这个特定任务的信息.

我希望能够读取多个文件(256×256文件)sizeof(double)字节位于每个文件的某个位置.现在我的解决方案是,对于每个文件:

  1. 打开文件(读取,二进制模式):

    fstream fTest("current_file", ios_base::out | ios_base::binary);

  2. 寻找我想读的位置:

    fTest.seekg(position*sizeof(test_value), ios_base::beg);

  3. 读取字节:

    fTest.read((char *) &(output[i][j]), sizeof(test_value));

  4. 并关闭文件:

    fTest.close();

这需要350 msfor{ for {} }具有256x256次迭代的结构内运行(每个文件一个).


问:您认为有更好的方法来实施此操作吗?你会怎么做?

c c++ optimization performance

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

最有效的方法来计算矩阵的每个元素的指数

我正在从Matlab迁移到C + GSL,我想知道什么是计算矩阵B的最有效方法:

B[i][j] = exp(A[i][j])
Run Code Online (Sandbox Code Playgroud)

其中i在[0,Ny]中,j在[0,Nx]中.

请注意,这与矩阵指数不同:

B = exp(A)
Run Code Online (Sandbox Code Playgroud)

这可以通过GSL(linalg.h)中的一些不稳定/不支持的代码来完成.

我刚刚找到了强力解决方案(几个'for'循环),但有没有更明智的方法呢?

编辑

来自Drew Hall的解决方案的结果

所有结果都来自1024x1024 for(for)循环,其中在每次迭代double中分配两个值(复数).时间是超过100次执行的平均时间.

  • 考虑{Row,Column} - 存储矩阵的主要模式时的结果:
    • 在Row-Major模式下循环内部循环中的行时为226.56 ms(情况1).
    • 在Row-Major模式下循环内循环中的列时为223.22 ms(情况2).
    • 使用gsl_matrix_complex_setGSL提供的功能时224.60 ms (案例3).

案例1的源代码:

for(i=0; i<Nx; i++)
{
    for(j=0; j<Ny; j++)
    {
        /* Operations to obtain c_value (including exponentiation) */
        matrix[2*(i*s_tda + j)] = GSL_REAL(c_value);
        matrix[2*(i*s_tda + j)+1] = GSL_IMAG(c_value);
    }
}
Run Code Online (Sandbox Code Playgroud)

案例2的源代码:

for(i=0; i<Nx; i++)
{
    for(j=0; j<Ny; j++)
    {
        /* Operations to …
Run Code Online (Sandbox Code Playgroud)

c performance matrix exponential

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

如何在Gnuplot中的二进制文件的开头跳过某些字节?

假设我有一个二进制文件,其格式如下:4*sizeof(double),4*sizeof(size_t),(Ny*Nx)*dizeof(double).

前4个双打和4个size_ts是关于文件的元信息.剩下的就是我想用gnuplot绘制的数据.

现在我必须将文件转换为另一个没有标题的文件使用命令绘制:

plot "convertedfile.data" binary format='%double' array=(Ny, Nx) u 1 w image
Run Code Online (Sandbox Code Playgroud)

问:有没有办法告诉gnuplot忽略N二进制文件的起始字节,然后将其余部分绘制成矩阵?

plot gnuplot

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

使用if(true)子句减少资源管理器对象的范围?

我有一个存储在多线程应用程序中的资源存储对象.为了(希望)确保线程安全我每次想要访问资源或插入新资源时都会锁定互斥锁.例如,要插入新资源:

void ResourceManager::insertResource(const std::string& id)
{
    // create the object with such ID
    Resource res = Resource(id);

    // ... more code on res

    // lock the mutex to insert the resource
    std::lock_guard<std::mutex> guard(mResourcesMutex);

    // insert the resource in a STL container
    mResources.insert(ResourceContainer::value_type(id, res));

    // ... more code that does not require the mutex lock
}
Run Code Online (Sandbox Code Playgroud)

我希望lock_guard最小化范围,以便尽快调用析构函数,其他线程可以访问资源.特别是,我想在mResources.insert(...)语句之后解锁互斥锁.

我想过使用一个天真的if语句来确定lock_guard的范围:

    if(true)
    {
        std::lock_guard<std::mutex> guard(mResourceMutex);
        mResources.insert(ResourceContainer::value_type(id, res);
    }
Run Code Online (Sandbox Code Playgroud)

但我不知道它的工作原理.我发现很难检查这是否确定了lock_guard是否正确,或者另一方面,编译器是否认为我疯了并且优化代码取出if语句.

我的问题是:

  • 这管用吗?
  • 这值得么?我会注意到性能受损吗?
  • 还有更好的选择吗?

c++ scope raii visual-c++

1
推荐指数
2
解决办法
434
查看次数