Я пишу некоторый код для проекта по вычислительной биохимии, и мне нужно иметь возможность иметь массив или вектор с более чем 10 миллионами объектов и выполнять ~ 50-100 миллионов итераций Монте-Карло, где каждая итерация может модифицировать объект из список наугад. Я относительно новичок в C ++, перехожу с Java (надеюсь, помимо прочего, на более быстрые улучшения).
Моя лаборатория находится в процессе заказа компьютера с 128 ГБ ОЗУ и 2 процессорами, но мой текущий компьютер имеет 4 ГБ ОЗУ. На данный момент у меня есть компилятор Visual Studio Express, хотя я слышал, что G ++ используется некоторыми из наших сотрудники. Буду признателен за рекомендации компилятора, если у кого-то есть, так как знаю, что у некоторых есть различия в производительности во время выполнения.
Моя главная проблема в том, что я не могу даже заставить эти объявления разумно компилироваться:
#include <iostream>
#include <random>
#pragma pack(push, 16) //Mostly ignorant about what this does
using namespace std;
struct RNAObject {
public:
string sequence;
string seqComplement;
int bindingInx5Prime;
int bindingInx3Prime;
int length;
enum type {MONOMER, SINGLE_STRAND, DOUBLE_STRAND, HAIRPIN, RIBOZYME};
};
void main() {
const static int maxSize = 10000000;
//RNAObject RNASoup[maxSize]; -Does not compile, stack overflow
//RNAObject* RNASoup[maxSize]; -Does not compile, stack overflow
vector<RNAObject> RNASoup(maxsize); //Compiles, but extremely slow already
cout << "Hello World"; //Stopped the compile before this line could happen
}
Однако в моей настройке Java на том же компьютере следующие строки компилируются немедленно, без каких-либо затруднений:
int maxSize = 10000000
RNAObject RNASoup[] = new RNAObject[maxSize];
Мне предстоит пройти долгий путь, поэтому любые соответствующие рекомендации будут с благодарностью.
Ваши две части кода (C ++ и Java) не эквивалентны.
Ваше объявление вектора C ++ создает вектор maxSize
объекты и назначает вновь созданный объект в каждый из maxSize
элементы (отсюда и медленное время запуска).
Ваш код Java просто создает maxSize
Рекомендации в RNAObject
s. Эквивалент Java-кода вашему C ++-коду:
int maxSize = 10000000
RNAObject RNASoup[] = new RNAObject[maxSize];
for (int i = 0; i < maxSize; i++)
RNASoup[i] = new RNAObject();
Есть два места, из которых можно выделить память: куча и стек. Стек довольно ограничен и используется для небольших объектов, однако он намного быстрее. Любая декларация формы:
Sometype someVariable;
Выделяет переменную в стеке.
Любая декларация с участием new
использует память из кучи, которая почти всегда ограничена только объемом оперативной памяти вашего компьютера. Следующая декларация выделяет указатель на Sometype
в стеке, и экземпляр Sometype
в кучу:
Sometype* someVariable = new Sometype();
Теперь о вашем коде:
1). RNAObject RNASoup[maxSize];
— создает одномерный массив RNAObject
в стеке.
2). RNAObject* RNASoup[maxSize];
— создает одномерный массив RNAObject
указатели в стеке.
3). vector<RNAObject> RNASoup(maxsize);
— создает вектор в стеке, тем не менее вектор хранит свои данные в куче, поэтому он работает. Однако вектор не очень подходит для вашего варианта использования: он был разработан для хранения данных, длина которых изменяется динамически, и эта функция снижает производительность.
Итак, что вы действительно хотите:
RNAObject* RNASoup = new RNAObject[maxSize];
Который создает указатель на массив в стеке и выделяет этот массив в куче.
Кроме того, из вашего вопроса совершенно очевидно, что вы не понимаете даже основ C ++. Вы должны выучить язык перед тем, как писать на нем, иначе у вас очень скоро будут большие проблемы.
ваша использованная строка и вектор в вашем коде, так что вам нужно
#include <string>
а также
#include <vector>
Кроме того, поскольку iostream, string и vector находятся в пространстве имен std, вам необходимо явно использовать это пространство имен, добавив
using namespace std;
или используйте полностью определенные имена, такие как
std::cout
std::vector
и т. д. чтобы ваш код работал.