小编Som*_*ter的帖子

绘制大量数据

我们目前正在使用ZedGraph绘制一些数据的折线图.输入数据来自任意大小的文件,因此,我们事先不知道数据点的最大数量是多少.但是,通过打开文件并读取标题,我们可以找出文件中有多少数据点.

文件格式基本上是[时间(双精度),值(双精度)].但是,条目在时间轴上不一致.在t = 0秒和t = 10秒之间可能没有任何点,但在t = 10秒和t = 11秒之间可能存在100K,依此类推.

例如,我们的测试数据集文件大约为2.6 GB,它有324M点.我们想向用户展示整个图表,让她浏览图表.然而,向ZedGraph加载324M点不仅是不可能的(我们使用的是32位机器),但也没用,因为屏幕上没有这么多点.

使用ZedGraph的FilteredPointList功能似乎也是不可能的,因为这需要先加载整个数据,然后对该数据执行过滤.

因此,除非我们遗漏任何东西,否则我们唯一的解决办法似乎是 - 以某种方式对数据进行抽取,但是当我们不断努力时,我们遇到了很多问题:

1-我们如何抽取未及时到达的数据?

2-由于无法将整个数据加载到内存中,因此任何算法都需要在磁盘上运行,因此需要仔细设计.

3-我们如何处理放大和缩小,尤其是当数据在x轴上不均匀时.

如果数据是统一的,在初始加载图形时,我们可以Seek()通过文件中预定义的条目数量,并选择每N个其他样本并将其提供给ZedGraph.但是,由于数据不统一,我们必须更加智能地选择要显示的样本,并且我们无法提出任何不必读取整个文件的智能算法.

我道歉,因为这个问题没有特别尖锐的特异性,但我希望我能解释一下我们问题的性质和范围.

我们在Windows 32位,.NET 4.0上.

.net c# charts zedgraph large-files

16
推荐指数
1
解决办法
8130
查看次数

使用BitConverter在C#中快速转换,它可以更快吗?

在我们的应用程序中,我们有一个非常大的字节数组,我们必须将这些字节转换为不同的类型.目前,我们BitConverter.ToXXXX()用于此目的.我们的重击手是,ToInt16ToUInt64.

因为UInt64,我们的问题是数据流实际上有6个字节的数据来表示一个大整数.由于没有将6字节数据转换为的本机函数UInt64,我们可以:

UInt64 value = BitConverter.ToUInt64() & 0x0000ffffffffffff;
Run Code Online (Sandbox Code Playgroud)

我们的使用ToInt16更简单,不必做任何操作.

我们在这两个操作中做了很多,我想问SO社区是否有更快的方法来进行这些转换.现在,这两个功能消耗了我们整个CPU周期的大约20%.

.net c# casting bitconverter

15
推荐指数
2
解决办法
7699
查看次数

处理非常大的数据集并及时加载

我有一个用C#(.NET 4.0)编写的.NET应用程序.在此应用程序中,我们必须从文件中读取大型数据集,并以类似网格的结构显示内容.因此,为了实现这一点,我在表单上放置了一个DataGridView.它有3列,所有列数据都来自文件.最初,该文件有大约600.000条记录,对应于DataGridView中的600.000行.

我很快发现,DataGridView崩溃了这么大的数据集,所以我切换到虚拟模式.为了实现这一点,我首先将文件完全读入3个不同的数组(对应3列),然后触发CellValueNeeded事件,我从数组中提供正确的值.

但是,正如我们很快发现的那样,这个文件中可能有一个巨大的(巨大的!)记录数.当记录大小非常大时,将所有数据读入数组或List <>等似乎是不可行的.我们很快就会遇到内存分配错误.(内存不足异常).

我们卡在那里,但后来意识到,为什么首先将数据全部读入数组,为什么不在CellValueNeeded事件触发时按需读取文件?这就是我们现在所做的:我们打开文件,但不读取任何内容,并且当CellValueNeeded事件触发时,我们先将Seek()放到文件中的正确位置,然后读取相应的数据.

这是我们能想到的最好的,但是,首先这是非常缓慢的,这使得应用程序缓慢且用户不友好.其次,我们不禁认为必须有更好的方法来实现这一目标.例如,某些二进制编辑器(如HXD)对于任何文件大小都非常快,所以我想知道如何实现这一点.

哦,并且为了解决我们的问题,在DataGridView的虚拟模式中,当我们将RowCount设置为文件中的可用行数(例如16.000.000)时,DataGridView甚至需要一段时间来初始化自身.对此"问题"的任何评论也将受到赞赏.

谢谢

c# file-io datagridview large-data

9
推荐指数
1
解决办法
2万
查看次数

在C#中单独的线程上快速记录/记录数据

我们正在开发一种应用程序,可以连续从多个外部硬件设备读取数据.数据速率介于0.5MB - 10MB /秒之间,具体取决于外部硬件配置.

目前正在BackgroundWorker上读取外部设备.尝试使用相同的BackgroundWorker将获取的数据写入磁盘似乎不是一个好的解决方案,所以我们要做的是,将这些数据排队以写入文件,并使另一个线程将数据出列并写入一份文件.请注意,数据将有一个生产者和单个消费者.

我们正在考虑为此目的使用同步队列.但是我们认为这个轮子必须已经发明了很多次,所以我们应该向SO社区提出一些意见.

对于我们应该注意的事项的任何建议或意见将不胜感激.

c# queue file-io logging thread-safety

8
推荐指数
1
解决办法
2648
查看次数

在Android中开发智能卡读卡器

我们开发了一个带有微控制器的原型板,它可以与SmartCard通信(它可以读取ATR,发出和读取对APDU命令的响应等).现在我想将这个硬件与Android手机或平板电脑一起使用.我们的电路板具有USB连接,通过它我们可以通过Android读取和写入MCU.

最终目标是在支持PKCS#11的Android平台上安装功能强大的智能卡读卡器,并为SmartCard读卡器的最终用户提供库,以便他们可以与卡进行通信.

我已经阅读了几个关于这个主题的讨论,其中一些讨论说我必须构建一个自定义Android才能做到这一点.我不熟悉Android架构,了解为什么当我可以通过USB与外围设备(读卡器)通信时,我必须重新构建Android.在我看来,如果我提供一个实现类似CCID接口的库,用户可以通过将我的库集成到他们的目标.apk文件,使用Android USB堆栈与我的阅读器进行通信.

我们不知道上述计划有什么问题吗?我担心我们缺少一些关于Android或SmartCard读卡器的基本信息(例如:安全性),这会在我们开始实施上述库时给我们带来问题.

usb android apdu smartcard

7
推荐指数
1
解决办法
2533
查看次数

PInvoke,指针和数组副本

我们正在使用针对x32的Win7 x64上的c#,.net 4.0构建应用程序.

我们在我们的应用程序中使用第三方库.我们知道这个库是用C++编写的.但是,为了让c#开发人员使用这个库,他们使用P/Invoke包装它,这就是我们调用API函数的方式.

其中一个API调用如下:

ReadFromDevice(int deviceAddress, int numBytes, Byte[] data);
Run Code Online (Sandbox Code Playgroud)

此函数从外部设备读取数字的数字,并将其放在data []中.如您所见,它希望将C#Byte数组视为第三个参数.现在,我们的问题是,我们希望将数据读取到预先声明的数组中的任意位置.例如:

Byte[] myData = new Byte[1024*1024*16];
ReadFromDevice(0x100, 20000, &myData[350]) // Obviously not possible in C#
Run Code Online (Sandbox Code Playgroud)

如果我们使用C/C++,这将是微不足道的.鉴于底层API是用C++编写的,我觉得我们应该能够在c#中做到这一点,但是,我无法弄清楚如何在c#中做到这一点.也许我们可以通过提供的P/Invoke接口以某种方式调用底层库并编写自定义接口?

任何想法,将不胜感激.

问候,

.net c# pinvoke pointers bytearray

5
推荐指数
1
解决办法
2553
查看次数

DataGridviewComboBox需要2次单击才能显示项目列表

可能重复:
单击一次打开下拉列表(在数据网格视图中)

我们有一个DataGridView,其中一列是具有DropDownButton样式的ComboBox.DataGridView处于FullRowSelect模式.假设我有5行,并在DataGridView中选择了行0.

我想从-say的ComboBox中选择一个项目例如第2行,因此我单击ComboBox的小箭头.当我这样做时,首先,选择DataGridView的第2行.ComboBox尚未打开.只有第二次单击才能打开ComboBox.

事实上,它过去需要3次点击,但后来我们重载了CellMouseDown来做:

myDataGridView.ClearSelection();
myDataGridView.Rows[e.RowIndex].Selected = true;
Run Code Online (Sandbox Code Playgroud)

有了这个,我们只有2次点击.有没有办法只显示一次单击显示ComboBox项目?

编辑:我还应该提一下,如果我单击ComboBox本身,而不是单击ComboBox的小箭头,只需3次单击即可显示ComboBox项目!

datagridview datagridviewcolumn datagridviewcombobox datagridviewcomboboxcell

4
推荐指数
1
解决办法
7443
查看次数

继承和铸造

我将继承类型转换为基类时遇到了一个基本问题.我知道这通常是不可能的,也就是说,你可以将派生类强制转换为它的基类,但事实并非如此.这是我正在努力解决的示例片段:

假设我已经定义了一个抽象类来表示计算机PCI卡:

public abstract class PciDevice
{
   public abstract int GetDeviceId();
   public abstract String GetVendorName();
}
Run Code Online (Sandbox Code Playgroud)

现在我创建了3种类型的继承类(设备):

public class GraphicsCard : PciDevice
{
   public override int GetDeviceId() { return 1666; }
   public override String GetVendorName() { return "CoolCorp"; }

   int trianglesPerSecond;
   ChipsetTypeEnum chipsetType;
}

public class AudioCard : PciDevice
{
   public override int GetDeviceId() { return 1999; }
   public override String GetVendorName() { return "ShinyCorp"; }

   int numChannels;
   int samplingRate;
}

public class Modem : PciDevice
{
   public override int …
Run Code Online (Sandbox Code Playgroud)

.net c# polymorphism inheritance casting

1
推荐指数
1
解决办法
585
查看次数