|
Thanks Greeeg,
1.
It is good to know there is no special limitation of Dictionary itself -- previous I suspect whether Dictionary has special size limitation over OS, e.g. it has a hard coded value 1G size limitation. Good to know there is no such limitation.
2.
I have searched for quite some time to find an easy to learn intuitive sample about how to get the full content of image from physical file into memory, and then make it into disk. Do you have any pseudo code or recommend some samples?
regards,
George
|
|
|
|
|
George_George wrote:
I have searched for quite some time to find an easy to learn intuitive sample about how to get the full content of image from physical file into memory, and then make it into disk. Do you have any pseudo code or recommend some samples?
You can use a FileStream to read the bytes of the image into a byte array and use Image.FromStream() to convert the bytes into an actual Image object.
You can also use the byte array to save it back to the file, a database or whatever you wish.
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Thanks Greeeg,
1.
If I want to use FileStream and read all content of a image file into memory, I want to choose the solution to keep the image in the form of byte[], becaue this solution is extensible to store other type of files, like Word/Excel/etc.
2.
Which API could be used to read the content of all binary file into memory? In my experience, I just read file line by line.
Any hints?
regards,
George
|
|
|
|
|
George_George wrote: Could Dictionary use virtual memory?
All memory that you use is virtual. You don't know if and where in the physical memory the data is loaded.
George_George wrote: Are there an easy to use sample which just convert image file into memory stream or byte[]?
Why don't you store the Image objects in the Dictionary?
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa!
Guffa wrote: Why don't you store the Image objects in the Dictionary?
Because I want to make my code transparent and suitable for all situations, e.g. in the future I may use the same code to store Word and Excel files.
I have searched for quite some time to find an easy to learn intuitive sample about how to get the full content of image from physical file into memory, and then make it into disk. Do you have any pseudo code or recommend some samples?
regards,
George
|
|
|
|
|
George_George wrote: I have searched for quite some time to find an easy to learn intuitive sample about how to get the full content of image from physical file into memory
byte[] imageData = System.IO.File.ReadAllBytes(filePath);
George_George wrote: and then make it into disk
What do you mean by that?
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa,
"What do you mean by that?" -- sorry my English is bad. I mean deserialize the image into disk. My usage scenario is, hold all image into memory in Dictionary object, then per query from clients, I will deserialize the image into disk so that the client could acess requested image.
Do you think my simple and quick solution is fine according to my usage scenario?
regards,
George
|
|
|
|
|
Why on earth would you keep the images in memory if you want to store them to disk before they are accessed? That only seems like a waste of memory and time.
How are the clients accessing the images? Do you really have to save them to disk to make them accessible?
George_George wrote: I mean deserialize the image into disk.
That doesn't make sense, as the images are not serialized...
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa,
1.
I am writing a web services which returns image by user ID. Previously I store images on disk which is very slow because I need to read all of them into memory each time before I send to requested client. The clients are web servers, which display user related image, like self-photo.
Do you think my solution of using Dictionary to hold image content could achive this goal?
2.
Guffa wrote: That doesn't make sense, as the images are not serialized... My typo - I mean serialize.
So, now from my background, do you think the solution we discussed so far could achive my goal?
regards,
George
|
|
|
|
|
So, if I ignore the parts that doesn't make sense, you are saying that you want to cache the files in memory so that you can return them from a web service?
That would work, but I really don't think that the disk access is your performance problem...
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Why Guffa? Disk is slower than memory, I think there should be performnace improvements.
regards,
George
|
|
|
|
|
Yes, but I don't think that the disk access i the bottle neck. Besides, if you read a file it will be in the disk cache, so next time you will actually be reading it from memory. And if you store too much in memory, some of it will be swapped to disk, so you will be reading some images from disk anyway...
Have you checked how much network bandwidth you are using?
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa!
The bandwidth between machine is 1G since it is network center internal high speed machine connection between the same sub-network.
Previous the images are stored in database as blob data type, it is several hundred M bytes (about 1G) footprint, I think if I could cache them all into memory, the performance could be improved, any comments?
(the reason why I think performance will be improved is the image retrieval is almost random, so I do not think disk cache could work well in a random access pattern.)
regards,
George
|
|
|
|
|
Say i had this class:
public sealed class Partner
{
string something;
string somethingelse;
List<Customer> customers = new List<Customer>();
public List<Customer> Customers
{
get { return customers; }
}
} Is this bad practice? If so, how can i make it right and still be able to get all the methods a List<> provides? I know i could use class Partner : List<Customer> but inside Customer there's two Lists so that solution won't work there. Is it really necessary that i write a custom List for each object, just to maintain good coding practice? I'm asking because my teacher says that the above example is bad OOP - and because i'm developing an application that really needs the methods a List<> provides....
modified on Wednesday, November 26, 2008 8:22 AM
|
|
|
|
|
I think your generics got swallowed by the HTML monster!
xacc.ide - now with TabsToSpaces support IronScheme - 1.0 beta 1 - out now! ((lambda (x) `((lambda (x) ,x) ',x)) '`((lambda (x) ,x) ',x))
|
|
|
|
|
You're right - should be working now.
|
|
|
|
|
Depending on the usage, Customers could be IEnumerable<Customer> . But I do not see any other way of mutating that list.
Jan Sommer wrote: I'm asking because my teacher says that the above example is bad OOP
So did he not bother to explain to you why he feels that way? Sounds like a bad teacher to me. Ask him if he is happy with what he does
xacc.ide - now with TabsToSpaces support IronScheme - 1.0 beta 1 - out now! ((lambda (x) `((lambda (x) ,x) ',x)) '`((lambda (x) ,x) ',x))
|
|
|
|
|
He said he didn't know a better way :P
The first solution i came up with was to add this method to class Partner:
public IEnumerator<Customer> GetCustomersEnumerator()
{
return this.cust.GetEnumerator();
}
which is working just fine for retrieving all the customers with this code:
IEnumerator<Customer> alist = partners.GetCustomerEnumerator();
while(alist.MoveNext())
{
Console.WriteLine(alist.Current.someProperty);
}
But in the userinterface, when a user clicks the customer (shown in a listview) i'd like to use the customer-index to retrieve the correct customer and send him to another dialog. Currently i'm only able to access each customers information and i can't pick a specific customer, since i don't have access to the list.
Am i doing it all wrong? I was considering using a database which would make everything alot easier, but that would be too hard for the other students (according to my teacher :P)
|
|
|
|
|
Jan Sommer wrote: Am i doing it all wrong?
You have 2 choices:
1. Expose it as an IList<Customer> and do cust.ToArray() .
2. Wrap cust in a ReadOnlyCollection<Customer> .
I would prefer the latter.
xacc.ide - now with TabsToSpaces support IronScheme - 1.0 beta 1 - out now! ((lambda (x) `((lambda (x) ,x) ',x)) '`((lambda (x) ,x) ',x))
|
|
|
|
|
Thanks... Didn't know of the ReadOnlyCollection but that seems reasonable to use..
|
|
|
|
|
Why for heavens sake should this be bad coding practice??
This is the normal way to do it: Declaring a private field and exposing it through a public property. There's no other way to do it right - your teacher is definitely wrong!
There is one concern with this I can think of:
1. The list should be immutable. If so, simply use customers.AsReadOnly() in your get accessor and provide some methods like Add/RemoveCustomer in your Partner class.
Regards
Thomas
www.thomas-weller.de
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning. Programmer - an organism that turns coffee into software.
|
|
|
|
|
I tend to agree. The only design guideline this might violate is from Bill Wagner's "Effective C#, Item 23: "Avoid Returning References to Internal Class Objects". But Thomas' suggestion to return a read-only object addresses (no pun intended) this issue.
|
|
|
|
|
i'm glad to hear i'm not completely wrong..
this sure have saved me a headache..
|
|
|
|
|
Always at your service...
Regards
Thomas
www.thomas-weller.de
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning. Programmer - an organism that turns coffee into software.
|
|
|
|
|
Hello everyone,
I have a static class which wraps a file stream object. And I want to implement the Dispose pattern. I define an uninitialize method in the static class which call Dispose explicitly with parameter value true. Here is my code,
My questions are,
1. Normally there should be a destructor in a class which calls Dispose with parameter value false, but for a static class, there is no concept like destructor, how to implement calling Dispose with false parameter?
2. When the Dispose method without parameter will be called?
3. Is it correct to call GC.SuppressFinalize(this)? Since for a static class, there is no "this" object?
4. Correct to define disposed as static field?
5. Are there anything wrong with my code?
static private StreamWriter currentLogStream;
private static bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private static void Dispose(bool disposing)
{
if (false == disposed)
{
if (disposing)
{
currentLogStream.Dispose();
}
}
disposed = true;
}
public static void Uninitialize()
{
Dispose(true);
}
thanks in advance,
George
|
|
|
|