Быстрое копирование выбранных элементов массива в C?

Это может быть очень простой вопрос, но он действительно мне много ошибок. То, что я пытаюсь сделать-это просто скопировать элементы в старом вектор в новый вектор с помощью С.

Копия основанный на индексе вектор, где каждый элемент этого вектора представляет собой индекс элемента в старом вектор. Индекс вектора не сортируется.

Например, старый вектор a = [3.4, 2.6, 1.1].

индекс вектора B = [1, 1, 3, 3, 2, 1, 2].

После копирования, я ожидаю, что новый вектор, чтобы быть с = [3.4, 3.4, 1.1, 1.1, 2.6, 3.4, 2.6].

Самое жестокое решение, я могу думать, чтобы запустить цикл по b и скопировать соответствующий элемент в C. Но когда вектор является слишком большой, стоимость не выносимо.

На мой вопрос, есть ли быстрее/умнее способ сделать копию в C по этому поводу?

Изначально код написан на Юлю и у меня не было проблем с этим. В Юлия, я просто использовать C = А[B] и это быстро. Кто знает, как они это делают?

Добавить c псевдо код:

float *A = []; # old array
int *B = []; # index array
float *C;
for(i=0;i<length(B);i++)
{
   *(C+i) = *(A+*(B+i));
}
+3
2019-09-19 02:23:00
источник
2 ответа

Пару вещей, чтобы рассмотреть со скоростью С3.

Выпуск 1. Как большой вы файлов zip? Выпуск 2. Где выполняется код проверки? Если вы используете его вне AWS, то вы можете испытывать связанные в сеть.

Не очень, чтобы сделать с вопросом 1, большие файлы большие файлы. Однако, с Вопрос 2 Чем ближе вы запустите ваш код проверки для S3 лучше. Для этого у вас есть два варианта.

Вариант 1: использовать экземпляр EC2. Если вы имеете дело с очень большими файлами zip, чем некоторые типы экземпляров обеспечивают лучшую производительность сети, чем другие. Но я бы начал с Т3 и посмотреть, как это работает для вас.

Вариант 2: использовать лямбда. Благо с помощью лямбда-выражения можно создать С3 событие-триггер, которое называет тебя лямда, когда каждый zip-файл будет загружен.

Кроме того, оптимизацию можно сделать, если вы просто загружаю зип после проверки, без изменения содержания является использование команды С3 МВ.

+0
2019-09-19 03:23:30

С3 не очень разработана, чтобы позволить это; как правило, вам нужно будет скачать файл, обработать его и загрузить извлеченные файлы.

Однако, тут может быть несколько вариантов:

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

  • Если вашей главной заботой является, чтобы избежать загрузки данных из АРМ в локальную машину, то, конечно, вы могли загрузить данные на удаленный экземпляр EC2 и работать, с или без s3fs. Это сохраняет данные в центрах обработки данных Amazon.

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

Установка

Многие системы обеспечивают встроенные пакеты:

  • Амазонки Linux через EPEL:
    sudo amazon-linux-extras install epel
    sudo yum install s3fs-fuse
  • В Debian и Ubuntu 16.04 9 или новее:
    sudo apt-get install s3fs

  • В Fedora 27 или новее:
    sudo yum install s3fs-fuse

  • RHEL и CentOS 7 или новее через EPEL:
    sudo yum install epel-release
    sudo yum install s3fs-fuse
  • В SUSE 12 и openSUSE 42.1 или новее:
    sudo zypper install s3fs
  • в macOS через доморощенного:
    brew cask install osxfuse
    brew install s3fs

s3fs поддерживает файлы стандартных АРМ учетные данные, хранящиеся в ${дома}/.АРМ/учетные данные. Кроме того, s3fs поддерживает пользовательский файл passwd.

Местоположение по умолчанию для s3fs файл пароля может быть создан:

using a .passwd-s3fs file in the users home directory (i.e. ${HOME}/.passwd-s3fs)
using the system-wide /etc/passwd-s3fs file

Введите свои учетные данные в файл в Vim ${домой}/.пароль-s3fs и установить разрешения только:

echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3fs
chmod 600 ${HOME}/.passwd-s3fs

Запустить s3fs с существующим ведро mybucket и каталог /путь/к/директории-точке монтирования:

s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs

Если у вас возникнут ошибки, включить отладочный вывод:

s3fs mybucket /path/to/mountpoint -o passwd_file=${HOME}/.passwd-s3fs -o dbglevel=info -f -o curldbg

Вы также можете смонтировать при загрузке введя следующую строку в /etc/fstab строчку:

s3fs#mybucket /path/to/mountpoint fuse _netdev,allow_other 0 0

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

+0
2019-09-19 03:23:30

Посмотрите другие вопросы по меткам