使用C读取大文件然后得到以下错误:OSError:异常:访问冲突写入0x000001708DB6E000

问题描述

我编写C代码读取LIBSVM数据集文件以调用函数create_BatchKmeans进行聚类,但是当数据集是777 MB(815,140,​​552字节)之类的大文件时,出现错误:

OSError: exception: access violation writing 0x000001708DB6E000

我不擅长C,所以我需要你的帮助

SfDataSet* NewDataSet(const string& file_name)
{
    //std::cerr << "Reading data from: " << file_name << std::endl;
    SfDataSet* data_set = new SfDataSet(file_name,40,false);
    return data_set;
}

int create_BatchKmeans(char* s,int s_len,int default_k,int default_iterations,float default_L1_lambda,float default_L1_epsilon)
{
    std::string ps(s,s_len);
    //memcpy(ps,s,s_len);
    for (int i = 0; i < s_len; i++)
    {
        ps[i] = s[i * 2];
    }
    ps[s_len] = '\0';
    SfDataSet* training_data = NewDataSet(ps);
    //training_data->vectors_[0].features_.size();

    int default_dimensionality = training_data->NumExamples();// (2 << 16);
    SfClusterCenters* cluster_centers = new SfClusterCenters(default_dimensionality);

    training_data->Transpose();

    sofia_cluster::OptimizedKmeansPlusPlus(default_k,*training_data,cluster_centers);

    sofia_cluster::BatchKmeans(default_iterations,cluster_centers,default_L1_lambda,default_L1_epsilon);

    std::fstream result_stream;
    string str_result = ps;
    str_result += ".result";
    result_stream.open(str_result.c_str(),std::fstream::out);
    if (!result_stream)
    {
        return 1;
    }
    for (int i = 0; i < cluster_centers->cluster_centers_.size(); i++)
    {
        for (int j = 0; j < cluster_centers->cluster_centers_[i].dimensions_; j++)
        {
            result_stream << cluster_centers->cluster_centers_[i].weights_[j];
            result_stream << " ";
        }
        result_stream << "\n";
    }
    result_stream.close();
    std::cerr << "Done." << std::endl;
    return 0;
}

解决方法

假设s_lens的字符长度,那么当您从s[i * 2]读取数据时,您是在数组外部访问。

由于NewDataSet()string作为自变量,因此ps应该是string而不是char*。您可以从s对其进行初始化。

std::string ps(s,s_len);
SfDataSet* training_data = NewDataSet(ps);

这会将s的内容复制到ps中,您不需要此循环:

for (int i = 0; i < s_len; i++)
{
    ps[i] = s[i * 2];
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...