![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как записать в файл массив размером 8 точек на миллион [D5, D6, D7, Win2k, WinXP]
yuraspb © (2006-11-10 19:06:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10 >
Как записать в файл массив размером 8 точек на миллион?
yuraspb (2006-11-16 14:55:00) [101]да число строго аргументировано, причём прогонять его надо аж 10 раз подряд ( 10 раз по 90000 ).
Кроме этого его нужно обрабатывать с помощью кластерного анализа, но сейчас главное хотябы минимум обработки ( нормировка ) и запись в файл.
Jeer (2006-11-16 14:54:00) [102]
> yuraspb © (16.11.06 14:17) [89]
Вам повезло, что я не Ваш начальник.
Сергей М. (2006-11-16 14:54:00) [103]И нафих, спрашивается, ты сюда чарт приплел ? Всуе ?
ANB (2006-11-16 14:51:00) [104]
> yuraspb © (16.11.06 14:17) [89]
Чет не вижу я никакого массива. Вроде как ты напрямую в выделенный буфер памяти пишешь. Если этот кусок работает, то прямо из этого буфера и запиши в файл - чего его в массив то копировать ?
Сергей М. (2006-11-16 14:50:00) [105]
> обычно 90000
Откуда это число взялось ? От балды взято ? Или чем-то аргументирован его выбор ? Как оно соотносится с массивом размером в ~50 мбайт (см. [9]) ?
yuraspb (2006-11-16 14:45:00) [106]обычно 90000
Сергей М. (2006-11-16 14:36:00) [107]
> count := frmInit.giConvCount;
И чему равно значение frmInit.giConvCount ?
yuraspb (2006-11-16 14:17:00) [108]With ptFaiData do
begin
overrun := @wOverrun;
count := frmInit.giConvCount;
start := 0; {Start from buffer begging}
DataType := Word(frmInit.chkFloatData.Checked);
ActiveBuf := 0; {Single buffer}
{If want floating data}
if DataType = 1 Then
i := SizeOf(single)
{Else need Raw data}
else
i := SizeOf(Word);
DataBuffer := Pointer(GlobalLock(frmInit.hUserbuf)); {Alolocate memory for data}
end;
lErrCde := DRV_FAITransfer(frmInit.ghDev, ptFaiData);
if DoesErr(lErrCde) = 1 then
begin
GlobalUnlock(frmInit.hBuf);
GlobalFree(frmInit.hBuf);
GlobalUnlock(frmInit.hUserbuf);
GlobalFree(frmInit.hUserbuf);
DRV_DeviceClose(frmInit.ghDev);
Exit;
end;
{Save data to data show screen}
p := ptFaiData.DataBuffer;
if gbCyclic = True Then
lRetrieved := ptFaiData.count - 1
else
lRetrieved := ptAiCheck.retrieved^ - 1;
frmDataShow.memData.Lines.Clear;
j:=0;
for i:=0 to (lRetrieved - 1) do
begin
if ptFaiData.DataType = 1 then
begin
{Converting to Floating data}
j:=j+1;
if j=1 then frminit.Chart1.Series[0].AddXY(i+vt,Single(p^),'',10289720);
if j=2 then frminit.Chart1.Series[1].AddXY(i+vt,Single(p^),'',16711680);
if j=3 then frminit.Chart1.Series[2].AddXY(i+vt,Single(p^),'',12550656);
if j=4 then frminit.Chart1.Series[3].AddXY(i+vt,Single(p^),'',40192);
if j=5 then frminit.Chart1.Series[4].AddXY(i+vt,Single(p^),'',65408);
if j=6 then frminit.Chart1.Series[5].AddXY(i+vt,Single(p^),'',65535);
if j=7 then frminit.Chart1.Series[6].AddXY(i+vt,Single(p^),'',33023);
if j=8 then frminit.Chart1.Series[7].AddXY(i+vt,Single(p^),'',255);
if j=8 then j:=0;
Longint(p) := Longint(p) + SizeOf(Single);
end
else
begin
{Convert to Hex data}
frmDataShow.memData.Lines.Append(Format('Buff[%d] = ', [i])+ IntToHex(Word(p^), 3));
Longint(p) := Longint(p) + SizeOf(Word);
end;
end;
{Free data buffer}
GlobalUnlock(frmInit.hBuf);
GlobalFree(frmInit.hBuf);
GlobalUnlock(frmInit.hUserbuf);
GlobalFree(frmInit.hUserbuf);
{Close device}
DRV_DeviceClose(frmInit.ghDev);
{Display the Data Show Form}
frmConverting.Enabled := True;
butTerminate.Caption := '&Terminate';
//frmDataShow.Show;
frmInit.Enabled := True;
frmConverting.Hide;
//rminit.StatusBar1.SimpleText:='Ãîòîâ. Èíôîðìàöèÿ îáðàáîòàíà. ';
//frminit.gotov:=true;
// if not frminit.stopp then frminit.butconvert.click;
end;
Сергей М. (2006-11-16 14:11:00) [109]Приведи фрагмент кода, в котором ты читаешь АЦП и заполняешь свой массив, тогда и рекомендации, возможно, будут.
yuraspb (2006-11-16 13:47:00) [110]Сергей М.,
Спасибо Вам за действительно Полезный совет. Я попробую так и сделать.
Соответственно считывать их тоже можно блоками? А как узнать сколько? Записывать число последней или первой записью?
Сергей М. (2006-11-16 11:32:00) [111]
> yuraspb © (16.11.06 11:15) [84]
>
> Да, похоже у меня не real
real или не real у тебя там - не суть как важно.
Ты лучше объясни нам, бестолковым, зачем тебе такой огромный по размеру массив ?
Что мешает считывать из АЦП блоки данных в массив размером, скажем, 4к и тут же записывать содержимое массива в файл ?
Mikhail V (2006-11-16 11:28:00) [112]Весело тут у вас
yuraspb (2006-11-16 11:15:00) [113]Да, похоже у меня не real )
Anatoly Podgoretsky (2006-11-14 08:55:00) [114]> fog (14.11.2006 02:55:21) [81]
> описание АЦП (min/max значения, вес 1 разряда)
Ну он же утверждает, что у него REAL :-)
fog (2006-11-14 03:22:00) [115]+ летом пролетал вопрос про осциллограф из звуковой платы -> в архив форума
fog (2006-11-14 02:55:00) [116]>Для тех кто в танке:
>Memory Mapped Files MSDN
согласен.
при такой частоте - только так.
+ описание АЦП (min/max значения, вес 1 разряда)
MikePetrichenko (2006-11-14 02:39:00) [117]
> Как это можно обойти? мне действительно нужно столько объектов.
Для тех кто в танке:
Memory Mapped Files MSDN
> вопрос более глобальный: ты выбором специальности не ошибся?
И не только специальности...
Ketmar (2006-11-14 02:24:00) [118]>[78] yuraspb(c) 14-Nov-2006, 01:57
>у меня 100кГц
ты платформой не ошибся?
вопрос более глобальный: ты выбором специальности не ошибся?
yuraspb (2006-11-14 01:57:00) [119]у меня 100кГц
fog (2006-11-14 01:13:00) [120]2 yuraspb
объясни, доступно, зачем тебе снимать 8 каналов с АЦП по 1 млн. точек - эт прим. 27.8 часов при 10 Гц на канал