|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
[quote источник ] BinaryReader.ReadBytes with PtrToStructure Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
[/quote] Правильно ли я понимаю, что: 1 - метод Marshal.PtrToStructure вернул резльтат, который явным образом был приведен к типу структуры 2 - значение, уже приведенное к типу структуры, в виде структуры копируется (value, non-reference copy) в локальную переменную (s)? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 04:30 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
не копируется, s указывает туда же, куда и buff. все эти танцы с бубном и устроены как раз для того, чтобы не копировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 08:20 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
RubinDm, по моему все верно. Т.к. TestStruct это структура, то значение копируется из управляемой кучи в стек. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 16:20 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
Antonariyне копируется, s указывает туда же, куда и buff.Очень хотелось бы в это верить, но увы, не верится. Возможно, Вы сможете дать какую-то ссылку на факты? Мне не удалось найти доказательства. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 19:58 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
RubinDmAntonariyне копируется, s указывает туда же, куда и buff.Очень хотелось бы в это верить, но увы, не верится. Возможно, Вы сможете дать какую-то ссылку на факты? Мне не удалось найти доказательства.а вообще да, копируется. это аналог CopyMemory ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2015, 20:58 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
Antonariy, вообще мне надо из stream'а по-быстрому прочитать в массив структур. и желательно сделать это за один раз, а не так, чтобы по чтению на каждый элемент массива. В идеале хотелось бы зафиксировать массив структур /* fixed() {...} */, и далее представить указатель на первый элемент массива как указатель типа byte* Правда дальше непонятно что с этим указателем на байты делать, т.к. это не совсем byte[], и указать byte* в качестве буфера методу stream.Read не получится. Кругом засада.. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2015, 00:10 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
RubinDm, В чем проблема? размер массива в байтах известен as [StructLayout(LayoutKind.Explicit, Size, CharSet=CharSet.Ansi)] очередность и добивка тоже [FieldOffset] читайте порциями из потока и через аллокацию на не управляемой памяти Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
получайте структуру и заносите ее в массив.. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2015, 09:33 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
Где-то в степи, мне порциями не надо (там порций - немерено) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2015, 16:41 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
RubinDm, 1)собственно структуру показал бы 2) немеряно - это сколько? порция - это что, массив структур фиксированной длины? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2015, 17:10 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
RubinDm, если порций немеренно, накой на кой их тащить в массив, вы как лох загубите свой loh Вы не знаете что такое чанкованииеа - лезете туда. сам поток это по существу проекция памяти где сидит массив значений, работайте с потоком как с массивом без создания массивов экземпляров, на лету создавайте индекс и по сдвижке выгребайте значения по условию where, что вы будете делать если поток 100 -300 гигов, или пара тер, по этому обобщенно настраивайтесь на MMF ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2015, 19:06 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
Где-то в степиRubinDm, если порций немеренно, накой на кой их тащить в массив, вы как лохо как Где-то в степизагубите свой lohс _уяли? я разве говорил о чтении всего стримА за раз в один массив? Где-то в степиВы не знаете что такое чанкованииеа - лезете туда.ну, куда уж нам до вас) этож тока вы тут девок голых видывали, а мы так, лохи кругом )) Где-то в степисам поток это по существу проекция памяти где сидит массив значенийэто мне не интересно, т.к. 1 - я это давно знаю без вас, 2 - оно мне в данном случае не сильно годится. У меня нет проблемы необходимости чтения из дофига диска в дофига оперативы.. ну НЕТУ такой задачи.. решается задача совсем другая: как представить массив структур в виде масива байтОВ, чтобы БЕЗ ЛИШНИХ копирований байтов стрим читал бы прямиком в массив структур. и НЕ надо мне тут рассказывать и предлагать бинари ридеры, MMFы и прочие полезные, хорошие вещи в стиле поштучной выкладки аля "получайте структуру и заносите ее в массив". В моем случае будет достаточно просто ТУПО прочитать из стрима кусок байтов вменяемого размера в массив структур\и байтов по совместительству. зы: ищо раз назовешь лохом - прокляну ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2015, 20:13 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
Изопропил1)собственно структуру показал бы Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Изопропил2) немеряно - это сколько? файл ~ от 250Мб и до гига - всякий раз по разному. Изопропилпорция - это что, массив структур фиксированной длины?да. скажем вычитывать надо по 2000шт структур за раз. по оперативе не особо накладно, и хватает на долго (алгоритму расчета). Потом я этот блок 2000*28 выкину в пул и снова заюзаю при загрузке и обработке очередной порции данных. собсно так оно уже и работает на ура. Но вот если бы еще натянуть чтонить типа Union'а на массив байтов и массив структур.. и читать в массив байтов - было бы идеально. но пока не получается. Потому приходится вычитывать 2000*28 байтов в отдельный массив, из которого потом данные через Buffer.MemoryCopy(...) сливаются в массив структур. Что не идеально (и по большему счету не нужно). Это не сильно добавляет расходов, но все-таки... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2015, 20:27 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
RubinDm, пущай маршаллер пашет :) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2015, 22:14 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
Где-то в степи, а вообще MMF - это объективно толково, по идее так и надо, что-то подзабыл я про них..) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2015, 01:50 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
ИзопропилRubinDm, пущай маршаллер пашет :) ...угу.. пробовал. в принципе - да, можно, с оговоркой что оно наверняк тож копирует ;) хотя не факт, но лимитов времени на ниокры уже маловато. + под .net 6 я словил массу глюканов в стиле "опа_clr_упало__вы_не_виноваты__позвоните_в_microsoft". Под .net 4.5 все ок. По перфомансу +пшик, все тож самое, как если тупо читать в byte[] без форматирования и затем копировать в struct[] предварительно зафиксив их оба. по факту диф в скорости реально на грани погрешности. Попробовал еще MMFы, о которых мне напомнили - получилось реально толково, особо если учесть, что там есть generic-методы, которые умеют принимать на вход структуры (которые параметры genericа) и читают прямиком в них. По ходу это ровно то что мне нужно, и сдается мне без излишних операций переливания из пустого в порожнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2015, 02:00 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
RubinDm, использование MMF в данном случае (ReadArray<T>)- тоже копирование, "переливание из пустого в порожнее", но выглядит пристойнее, чеи p/invoke ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2015, 04:29 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
ИзопропилRubinDm, использование MMF в данном случае (ReadArray<T>)- тоже копирование, "переливание из пустого в порожнее"наверняка. но отрабатывает по факту мгновенно, настолько мгновенно, что становится по большому счету просто пофигу, как именно оно это делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2015, 14:50 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
RubinDm, какой смысл читать кусками с потока в массив байт потом преобразовывать в структуры, когда есть поток он и есть массив байтов и есть параметр сдвижки, все очень просто и примитивно, без всякого засорения памяти. при одно проходном исследовании потока на коайсемь 10 миллионов структуробайтов исследуется меньше трех секунд. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2015, 20:46 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
[quot Где-то в степи]RubinDm, какой смысл читать кусками с потока в массив байт потом преобразовывать в структуры, когда есть поток он и есть массив байтов и есть параметр сдвижки, все очень просто и примитивно, без всякого засорения памяти. при одно проходном исследовании потока на коайсемь 10 миллионов структуробайтов исследуется меньше трех секунд. [spoiler ] В моем конкретном случае все чуток сложнее. мне надо построить конвеер. на входе - стрим со стуктурирными данными. Это может быть что-угодно, например, последовательные показания с каких-то датчиков на производстве. К каждому элементу последовательности применяется некий алгоритм преобразования элемента (по факту - делегат и, само собой, параметрами делегата являются ref входящей структуры и out исходящей структуры, типы которых, само собой, также являются параметрами ШАБЛОНА делегата). На выходе получаем преобразованные делегатом новые элементы новой последовательности, которые, как не трудно догадаться, подаются на вход следующего этапа конвеера. ФИШКА в том, что конвеер состоит по меньшей мере из 10 станков (делегатов), и половина из этих делегатов, увы, хочет на вход не только очередной элемент из исходной последовательности, но еще и предыдущие элементы в N-горизонте, который задается параметром для всего конвеера в целом или для конкретного станка. Таким делегатом может быть например алгоритм вычисления плавающей средней величины, которую невозможно вычислить только лишь из текущего элемента. Как следствие - такой делегат вынужден обращаться к исходной последовательности с тем, чтобы прочитать элементы в горизонте от текущего. В итоге количество обращений к элементам последовательности сильно возрастает (в N раз), и требования в части производительности к механизмам чтения элементов последовательности растут соответственно. Каждый вызов каждого метода в итоге реально в легкую выпиливает i7. И львиная часть расходов - это инфраструктурные расходы на вызовы методов. Поэтому приходится экономить на вызовах, в т.ч. на вызовах методов IO, и (!) особенно на вызовах реализаций IEnumerator. От всех этих плюшек приходится отказываться. И если есть возможность за раз прочитать не 1, а 1000 записей и закешить их в массив, то так и надо делать. зы: задача уже реализована в виде шаблона (с параметром типа структуры), под капотом MMF и разумный кеш прочитанных структур. Работает на ура. Из нерешенного на данный момент: делегаты (станки) - они все, как правило предельно простые (элементарная арифметика, + вычисление средних величин с горизонтами не более 32). количество возможных делегатов ограничено и поддается перечислению. Т.е. в принципе вместо самого делегата на очередном этапе конвеера можно было бы указывать не сам делегат, а константу, определяющую делегат с тем, чтобы станок мог быть реализован в виде switch'а по константе с вызовами соответствующих константам делегатов. Это может оказаться _очень_ полезно, т.к. появляется возможность вправить компилятору мозг на тему встраивания кода делегатов в тело станка (MethodImpl.AgressiveInlining), что сводит количество вызовов делегатов к нулю и дает бешеный рост в производительности. Насколько я понимаю, организовать Inline-вызов делегата, который был указан в качестве параметра, в принципе не возможно. И увы, но в случае работы с шалонами засада в том, что организовать AgressiveInlining не так-то просто. По крайней мере я пока еще не понимаю, как это можно было бы сделать. Но даже тот результат, который достигнут без AgressiveInlining, уже можно считать удовлетворительным. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2015, 04:51 |
|
BinaryReader.ReadBytes with PtrToStructure Все ли я правильно понимаю?
|
|||
---|---|---|---|
#18+
авторТаким делегатом может быть например алгоритм вычисления плавающей средней величины, которую невозможно вычислить только лишь из текущего элемента. Как следствие - такой делегат вынужден обращаться к исходной последовательности с тем, чтобы прочитать элементы в горизонте от текущего. В итоге количество обращений к элементам последовательности сильно возрастает (в N раз), и требования в части производительности к механизмам чтения элементов последовательности растут соответственно.а нельзя заранее построить список делегатов, и на каждом шаге в соответствии со списком вычислять все необходимые им данные, а не скакать туда-сюда по последовательности? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2015, 12:35 |
|
|
start [/forum/topic.php?fid=20&msg=39116535&tid=1401002]: |
0ms |
get settings: |
19ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 346ms |
total: | 477ms |
0 / 0 |