Valera Vino
Победившая ставка- Проекты 5
- Оценка -
- Рейтинг 147
Бюджет: 1000 UAH Срок: 1 день
Сделаю через dll.
В делфи не нашел идеального способа, поэтому в шарпе соберу dll и через неё будем работать.
Бюджет: 1000 UAH Срок: 1 день
Функция CreateFileA
Второй параметр dwDesireAccess - устанавливаете в
GENERIC_READ
Третий - dwShareMode ставите в 1
Главное правило - все остальные открытия данного файла (другими потоками или процессами) не должны противоречить первому открытию в вопросах прав совместного доступа.
Синхронизацию чтения если требуется можно и через евенты или через вами определенные флаги/значения в shared memory. Из одного процесса вообще не проблема. Вот собственно и весь алгоритм. Более детально - две пачки честера и кофе. Будет со схемками/блоками ))
Ставки скрыты
Ставки пока отсутствуют
-
Марья Йота 10 июня 2019По-моему это невозможно. Многопотоково один файл. Или я чего то не знаю )))
Только стрим ("на лету") качать данные и обрабатывать.
-
Евгений Сергеевич
10 июня 2019
Мне необходимо многопоточно и синхронно дергать строки поочередно в каждый поток с смещением от начала и до конца файла.
-
Марья Йота 10 июня 2019Ну если только сплитить (разделит) файл на мильён файлов и тогда обрабатывать их в многопотоке.
-
Игорь Ляльченко 10 июня 2019Нет. Совместный доступ я описал в ставке. Собственно полагая что именно он вызвал проблему, т.к в содержимом файла, судя по ТЗ строки одинаковой длины и считать конкретную путем установки указателя на нужную ф-ей SetFilePointer не вызывает сложностей. Совместный доступ на чтение сам по себе прост. Правило которого следует придерживаться - первое открытие файла должно разрешать совместный доступ на чтение, а остальные открытия не противоречить друг другу в вопросах прав доступа. Например если вы открыли файл для чтения и записи, с произвольным доступом на чтение, а второй раз его пытаетесь открыть с разрешением произвольного доступа на чтение то это будет противоречить первому открытию, предусматривающему и запись тоже. Вот и вся тонкость
-
Марья Йота 10 июня 2019В том то и дело (как я уже писала), что строки неодинаковой длины.
Например:
заказ №3 13.04.2019
заказ №456 13.12.2199
Поэтому даже сплитить файл - это потеря, как минимум, одной "записи".
-
Игорь Ляльченко 10 июня 2019Ну а при неодинаковой длинне всегда полезно сперва составить карту строк. Массив смещений от начала. Иначе произвольный доступ к сотне байт, превратится в перечитывание 2гб
-
Игорь Ляльченко 10 июня 2019Ну а если не лабораторная (где выигрыш от многопоточности не в скорости чтения, а в скорости получения запроса), а чтение именно последовательное от начала и до конца.. то господа коллеги верно отметили - многопоточность сразу снизит скорость работы, так как после чтения одного блока, для чтения второго (того же самого фактически, ранее прочитанного) нужно будет дергать считывающие головки туда сюда и кроме жуткого рычания диска под нагрузкой не получите ничего интересного
-
Евгений C 10 июня 2019Такое "многопоточное" чтение бессмысленно, т.к. приведёт не к увеличению скорости чтения, а наоборот - к деградации, особенно если файл находится на жёстком диске.
-
Игорь Ляльченко 10 июня 2019А вот вопрос. Смотря какие цели. Чем ставить очередь на чтение к примеру не один-два запроса и с непредсказуемым доступом внутри файла, да ещё мелких объемов на чтение.. то скорость многопоточного варианта таки возрастет
-
Игорь Ляльченко 10 июня 2019Нет, безусловно, блины вращаться быстрее не станут от того что файл открыт 1000 раз. Это понятно ))
Вопрос для чего это дальше. Но технически это возможно и не сложно придумать ситуацию, когда это хоть и не вызовет большей скорости работы железа, но это железо поднапряжет и что то из него таки выдавит сверх однопоточного.
-
Евгений C 10 июня 2019Да нет, вы только проиграете по скорости, потому что скорость последовательного чтения как минимум на 2 порядка выше скорости случайного чтения. А при многопоточном чтении вы как раз и получите вариант случайного чтения данных с диск.
-
Игорь Ляльченко 10 июня 2019Если нужно последовательное (строго последовательное, напр речь о копировании файла) то да, безусловно правы.
Так же если после чтения блока минимум обработки и мы готовы читать след.блок молниеносно то тоже да, тоже правы.
Ну а если речь о необходимости произвольного чтения что в один что в несколько потоков ? Или вариант когда требуется доп обработка перед тем как можно читать дальше и пока мы обрабатываем hdd простаивает?
-
Вячеслав Азаров 10 июня 2019Нужно оптимизировать обработку потока файла, в алгоритме о котором вы не сказали ни слова. Открытие нескольких дескриторов не увеличит скорость обработки информации, физический диск то один.
-
Игорь Ляльченко 10 июня 2019Ну и ещё может не быть алгоритма а может быть задача по какой нибудь лабораторной ))
В которой сказано - нужно многопоточно ))
-
Евгений C 10 июня 2019Выигрыш от многопоточности будет только при обработке файла, а не при его чтении. Чтобы получить максимальную скорость, читать нужно одним потоком последовательно, а обрабатывать считанные данные уже многопоточно.
-
Игорь Ляльченко 10 июня 2019согласен. почти всегда это возможно реализовать именно таким способом ))
я лишь говорю что многопоточно это тоже возможно, хоть и под сомнением целесообразность.
Актуальные фриланс-проекты в категории Десктопные приложения
Добрый день Необходимо создать модуль, который будет работать с БД Firebird на C++ для продажи товаров. Есть примеры готовых решений и описание функционала модуля. Основные функции: авторизация, выбор товара на экране из групп/подгрупп, переход в корзину, оплата картой и печать чека. Программа должна работать на Windows 10 и выше, использовать существующую базу данных.
Написать и создать мобильное приложение. Нужен творческий и высокопрофиссиональный подход, так как идея приложения не обычная)
Разработка приложения Power App, сопровождение меня как новичка. Canvas App, помощь в разработке экрана Помощь в разработке структуры данных для приложения Программирование функций Помощь в создании таблиц Date-verse