超大阵列

时间:2015-09-18 16:00:18

标签: c# gcallowverylargeobjects large-data

我必须使用尺寸为34000x34000项的二维数组进行数学计算。

明显的问题 - CLR不可能在内存中存储如此大的数据部分。我尝试使用MemoryMappedFile,但在我尝试为对象创建查看器时它也失败了:MemoryMappedFile.CreateViewAccessor()。是否还有其他已存在的存储大型数组的方法? (因为我没有太多时间尝试实现自定义大数据存储)

感谢

3 个答案:

答案 0 :(得分:8)

<gcAllowVeryLargeObjects>配置元素允许64位进程使用2-Gb数组。你可以尝试一下。

另外,看看sparse arrays是否可以帮助您:

  

稀疏数组是一个数组,其中大多数元素都有默认值(通常为0或null)。大数组中零值元素的出现对于计算和存储都是低效的。

答案 1 :(得分:0)

如果您使用的是.NET 4.5,则可以使用myApp.controller('myController', ['$scope', 'identityFactory', 'databaseFactory', function ($scope, identityFactory, databaseFactory) { $scope.query = JSON.stringify({ 'username': identityFactory.getLoginPair()[0], 'password': identityFactory.getLoginPair()[1], 'query': 'SELECT * FROM TABLE1;' }); databaseFactory.querydb($scope.query).then(function (response) { $scope.rows = angular.fromJson(response.data); $scope.cols = Object.getOwnPropertyNames($scope.rows[0]); }, function (response) { $scope.rows = response.data || "Request failed"; $scope.status = response.status; }); $scope.setBsClass = function (row) { if (row['ColName'] == 'Condition') { return 'danger'; }; }; }]); - config元素。它配置GC,以便它允许内存中大于2GB的对象。请参阅this,“我的应用适用于大型数据集(使用对象&gt; 2GB)”,分别为this

答案 2 :(得分:0)

作为gcAllowVeryLargeObjects的替代方案,考虑使用锯齿状数组 - 处理一块巨大的内存(我想大约10GB用于双打)肯定需要额外的努力。

YourType[][] array = Enumerable.Range(0, 34000).Select(_ => new YourType[34000]).ToArray();

请注意,您肯定需要x64进程才能使用此类数组 - 请确保仅使用x64显式构建exe。