Оптимизируйте чтение-запись огромные данные (C++)

используют условное агрегирование со случаем, когда выражение

демо

select jobid, 
       max(case when description in ('Done','Status') then description end) as description1,
       max(case when description in ('Success') then description end) as description2,
       max(case when description in ('Fail') then description end) as description3
from tablename
group by jobid

7
задан David Segonds 12 March 2009 в 23:39
поделиться

8 ответов

Так как Вы не упоминаете ОС, что Вы работаете на этом, Вы посмотрели на размещение в ОЗУ файл и затем использование стандартных стандартных программ памяти для "обхождения" файла, поскольку Вы продвигаетесь?

Таким образом, Вы не используете fseek/fread вместо этого, Вы используете адресную арифметику с указателями. Вот mmap пример для копирования одного файла от исходного файла до целевого файла. Это может улучшить производительность.

Другие вещи, которые Вы могли изучить, разделяет файлы на меньшие файлы и использует значение хэш-функции, соответствующее единице измерения времени для закрытия затем открытый следующий файл для продолжения моделирования, этот способ иметь дело с меньшими файлами, которые могут более настойчиво кэшироваться хостом ОС!

10
ответ дан 6 December 2019 в 08:17
поделиться

Эффективность этой идеи зависит от Вашего шаблона доступа, но если Вы не смотрите на те переменные данные размера каждый цикл, Вы могли бы ускорить доступ путем реконструкции файловой структуры:
Вместо того, чтобы писать прямой дамп структуры как это:

struct { 
  int x;
  enum t;
  int sz
  char variable_data[sz];
};

Вы могли записать все части фиксированного размера впереди, затем сохранить переменные части позже:

struct {
  int x;
  enum t;
  int sz;
  long offset_to_variable_data;
};

Теперь, когда Вы анализируете файл каждый цикл, можно линейно считать записи N за один раз. Необходимо будет только иметь дело с fseek, когда необходимо выбрать данные переменного размера. Вы могли бы даже рассмотреть хранение, что переменная часть в отдельном файле так, чтобы Вы также только читали вперед через тот файл.

Эта стратегия может даже улучшить Вашу производительность, если Вы действительно идете с файлом с отображенной памятью как предложенные другие.

3
ответ дан 6 December 2019 в 08:17
поделиться

Вы могли бы рассмотреть использование файлов с отображенной памятью. Например, посмотрите повышение:: межпроцессный, поскольку они обеспечивают удобную реализацию.

Также Вы могли бы рассмотреть использование stlxxl, который обеспечивает STL как функциональность, нацеленная к большим filebased наборам данных.

И еще один также - если Вы хотите итератор как доступ к Вашим данным, затем взгляните на повышение:: iterator_facade.

Если Вы не хотите играть с необычными приемами, Вы могли бы обеспечить дополнительный двоичный файл, содержащий индекс для файла со структурами (содержащий смещения начальных смещений структуры). Это обеспечило бы косвенный произвольный доступ.

3
ответ дан 6 December 2019 в 08:17
поделиться

Возможно, не релевантный в этом случае, но мне удалось увеличить действия в приложении с тяжелым чтением файла и записью путем записи сжатых данных (zlib) и распаковки на лету, уменьшенного времени чтения-записи по сравнению с увеличенной загрузкой ЦП, являющейся победой.

С другой стороны, если Ваша проблема состоит в том, что объем данных не умещается в памяти, и Вы хотите использовать диск в качестве кэша, можно изучить memcached, который обеспечивает кэш масштабируемой и распределенной памяти.

2
ответ дан 6 December 2019 в 08:17
поделиться

"миллионы" карт не походят на большое количество данных. Что препятствует тому, чтобы Вы сохранили все данные в памяти?

Другая опция состоит в том, чтобы использовать некоторый стандартный формат файла, подходящий для Ваших потребностей, например, sqlite (используйте SQL для хранившего/получения данных), или некоторый специализированный формат как hdf5, или определите Вас собственный формат с помощью чего-то как Google Protocol Buffers.

2
ответ дан 6 December 2019 в 08:17
поделиться

Используйте файл с отображенной памятью (http://en.wikipedia.org/wiki/Memory-mapped_file);

1
ответ дан 6 December 2019 в 08:17
поделиться

Платформы как Повышение и ACE обеспечивают независимый от платформы доступ к файлам с отображенной памятью. Это должно значительно ускорить Ваш парсинг.

0
ответ дан 6 December 2019 в 08:17
поделиться

Храните вычисленные данные в реляционной базе данных.

1
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: