如何解决使用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_len
是s
的字符长度,那么当您从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];
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。